質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

628閲覧

Xcode12.5でバーコードの読み取りはできていますが、表に反映されず困っています。

snowlove2

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/04/29 13:14

編集2021/04/29 13:16

前提・実現したいこと

カメラでバーコードを読み取り、JANコードが一致する商品名、タイプ、金額を表として表示させたいです。
ここに質問の内容を詳しく書いてください。
Xcode12.5で読み取ったバーコードから商品名、タイプ、金額を表として表示させるiOSアプリを作成しています。
エラーコードは出ませんが、バーコードを読み取った後に表へ戻っても読み取った内容が表示されません。
どこがおかしいのでしょうか?

発生している問題・エラーメッセージ

エラーメッセージはなし

該当のソースコード

Swift

表を表示させるビューコントローラー class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { var productsNameArray = ["商品名"] var productsTypeArray = ["タイプ"] var productsPointArray = ["ポイント"] @IBAction func readerOpen(_ sender: UIButton) { UserDefaults.standard.set(productsNameArray, forKey: "productsSet") UserDefaults.standard.set(productsTypeArray, forKey: "typeSet") UserDefaults.standard.set(productsPointArray, forKey: "pointSet") self.present(ViewControllerCamera(), animated: true, completion: nil) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. productsNameArray = UserDefaults.standard.array(forKey: "productsSet") as? [String] ?? productsNameArray productsTypeArray = UserDefaults.standard.array(forKey: "typeSet") as? [String] ?? productsTypeArray productsPointArray = UserDefaults.standard.array(forKey: "pointSet") as? [String] ?? productsPointArray } // 追加③:セルの個数を指定するデリゲートメソッド(必須) func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return productsNameArray.count; } // 追加④:セルに値を設定するデータソースメソッド(必須) func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // セルを取得する let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) // TableViewCellの中に配置したLabelを取得する let label1 = cell.contentView.viewWithTag(1) as! UILabel let label2 = cell.contentView.viewWithTag(2) as! UILabel let label3 = cell.contentView.viewWithTag(3) as! UILabel // Labelにテキストを設定する label1.text = productsNameArray[indexPath.row] label2.text = productsTypeArray[indexPath.row] label3.text = productsPointArray[indexPath.row] return cell } } カメラ起動ビューコントローラー class ViewControllerCamera: UIViewController, AVCaptureMetadataOutputObjectsDelegate { var productsNameArraySub = UserDefaults.standard.array(forKey: "productsSet") as! [String] var productsTypeArraySub = UserDefaults.standard.array(forKey: "typeSet") as! [String] var productsPointArraySub = UserDefaults.standard.array(forKey: "pointSet") as! [String] let productsJAN = ["4901880202675", "4901777302204", "4901004053978"] let productsName = ["金のレモンサワー", "プレミアムモルツ", "アサヒ生ジョッキ缶"] let productsType = ["Sour", "Beer", "Beer"] let productPoint = ["250", "350", "300"] // カメラやマイクの入出力を管理するオブジェクトを生成 private let session = AVCaptureSession() override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .white // カメラやマイクのデバイスそのものを管理するオブジェクトを生成(ここではワイドアングルカメラ・ビデオ・背面カメラを指定) let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back) // ワイドアングルカメラ・ビデオ・背面カメラに該当するデバイスを取得 let devices = discoverySession.devices // 該当するデバイスのうち最初に取得したものを利用する if let backCamera = devices.first { do { // QRコードの読み取りに背面カメラの映像を利用するための設定 let deviceInput = try AVCaptureDeviceInput(device: backCamera) if self.session.canAddInput(deviceInput) { self.session.addInput(deviceInput) // 背面カメラの映像からQRコードを検出するための設定 let metadataOutput = AVCaptureMetadataOutput() if self.session.canAddOutput(metadataOutput) { self.session.addOutput(metadataOutput) metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) // 読み取りたいバーコードの種類を指定 // .ean13 は本の書籍などに使用されるバーコード // .qr はQRコード、などなど metadataOutput.metadataObjectTypes = [.ean13] // 読み取り可能エリアの設定を行う // 画面の横、縦に対して、左が10%、上が40%のところに、横幅80%、縦幅20%を読み取りエリアに設定 let x: CGFloat = 0.1 let y: CGFloat = 0.4 let width: CGFloat = 0.8 let height: CGFloat = 0.2 metadataOutput.rectOfInterest = CGRect(x: y, y: 1 - x - width, width: height, height: width) // 背面カメラの映像を画面に表示するためのレイヤーを生成 let previewLayer = AVCaptureVideoPreviewLayer(session: self.session) previewLayer.frame = self.view.bounds previewLayer.videoGravity = .resizeAspectFill self.view.layer.addSublayer(previewLayer) // 読み取り可能エリアに赤い枠を追加する let detectionArea = UIView() detectionArea.frame = CGRect(x: view.frame.size.width * x, y: view.frame.size.height * y, width: view.frame.size.width * width, height: view.frame.size.height * height) detectionArea.layer.borderColor = UIColor.red.cgColor detectionArea.layer.borderWidth = 3 view.addSubview(detectionArea) // 閉じるボタン let closeBtn:UIButton = UIButton() closeBtn.frame = CGRect(x: 20, y: 20, width: 100, height: 40) closeBtn.setTitle("閉じる", for: UIControl.State.normal) closeBtn.backgroundColor = UIColor.lightGray closeBtn.addTarget(self, action: #selector(closeTaped(sender:)), for: .touchUpInside) self.view.addSubview(closeBtn) // 読み取り開始 self.session.startRunning() } } } catch { print("Error occured while creating video device input: (error)") } } } func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject] { // バーコードの内容が空かどうかの確認 if metadata.stringValue == nil { continue } // 読み取ったデータの値 print(metadata.type) print(metadata.stringValue!) // 取得したデータの処理を行う let dataString = metadata.stringValue! if let firstIndexSub = productsJAN.firstIndex(of: dataString) { let nameArrayAdd = productsName[firstIndexSub] let typeArrayAdd = productsType[firstIndexSub] let pointArrayAdd = productPoint[firstIndexSub] productsNameArraySub.append(nameArrayAdd) productsTypeArraySub.append(typeArrayAdd) productsPointArraySub.append(pointArrayAdd) let alert: UIAlertController = UIAlertController(title: "バーコードの中身", message: metadata.stringValue, preferredStyle: UIAlertController.Style.alert) let cancel: UIAlertAction = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler:nil) alert.addAction(cancel) present(alert, animated: true, completion: nil) }else { return } } } // 閉じるが押されたら呼ばれます @objc func closeTaped(sender: UIButton) { UserDefaults.standard.set(productsNameArraySub, forKey: "productsSet") UserDefaults.standard.set(productsTypeArraySub, forKey: "typeSet") UserDefaults.standard.set(productsPointArraySub, forKey: "pointSet") self.dismiss(animated: true, completion: nil) } }

試したこと

userdeffaultsのセットを閉じるが押された際ではなくバーコード読み取り動作の後に行われるようにしましたが、変わらずでした。

Xcode12.5

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/04/29 17:18

closeTaped の際に ViewController の表示を更新するメソッドを呼ぶようにする必要があるでしょうね。 ViewController を ViewControllerCamera の delegate にするか、クロージャを渡すか…。
tomato879241

2021/04/29 21:06

「金額を表として表示させたい」とはどういう意味でしょうか?「表」と書いても、何の表か自分にはわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問