前提・実現したいこと
Swiftまだ素人です。
端末のカメラを使って商品のバーコードを読み取り、それを使って色々するアプリを制作しています。
異なる複数のViewControllerに置かれたボタンから、ReaderVCという共通のカメラを起動しバーコードを読み取ると、元の画面に戻り、画面に置かれたTextFieldの中に入力されるという処理を実現したいのですが、どんなやり方をすれば実現できるのか目処が立っていない状況です。
ユーザーデフォルトは使わないという条件なので、NotificationCenterやクロージャーを使って処理するという案も出ているのですが、どちらも使い方を理解するのが難しいです。
VC間のデータの受け渡しには、他にもやり方はあるのでしょうか。
参考になるWebページのリンクやヒントになるようなことを知っていらしたら教えてくださると嬉しいです。
それぞれの画面にViewControllerのファイルがあります。
該当のソースコード
ReaderVC
1 2import UIKit 3import AVFoundation 4 5class ReaderVC: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 6 7 private let session = AVCaptureSession() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back) 13 let devices = discoverySession.devices 14 if let backCamera = devices.first{ 15 do{ 16 let deviceInput = try AVCaptureDeviceInput(device: backCamera) 17 if self.session.canAddInput(deviceInput){ 18 self.session.addInput(deviceInput) 19 let metadataOutput = AVCaptureMetadataOutput() 20 if self.session.canAddOutput(metadataOutput){ 21 self.session.addOutput(metadataOutput) 22 metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 23 24 metadataOutput.metadataObjectTypes = [.ean13] 25 self.session.startRunning() 26 } 27 } 28 }catch{ 29 print("エラーが起きました") 30 } 31 } 32 33 } 34 35 36 func metadataOutput(_ output:AVCaptureMetadataOutput, didOutput metadataObjects:[AVMetadataObject],from connection: AVCaptureConnection){ 37 for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject]{ 38 if metadata.stringValue == nil{ 39 continue 40 } 41 print(metadata.type) 42 print(metadata.stringValue!) 43 44 dismiss(animated: true, completion: nil) 45 } 46 47 } 48 49 50 51 52 53 54 55
補足
開発環境はSwift4
iOS12が対象
Xcode10.2.1
回答3件
あなたの回答
tips
プレビュー