Swift中使用performSegue传值报错:无BarcodeSegue segue标识
扫码结果回传与Segue错误修复
错误原因
你碰到的NSInvalidArgumentException是因为两个问题:
- Storyboard中没有创建
BarcodeScannerViewController到BarcodeViewController的segue,或者创建了但未设置标识符为BarcodeSegue; - 核心逻辑错误:用segue反向跳转只会生成新的
BarcodeViewController实例,无法回到原来的页面给TextField赋值。
正确实现方案(闭包回调)
1. 修改扫码页面控制器(BarcodeScannerViewController)
import UIKit import AVFoundation class BarcodeScannerViewController: UIViewController { // 定义回调闭包,用于传递扫码结果 var onScanCompleted: ((String) -> Void)? // 你的扫码初始化、会话启动等代码保留不变 func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { captureSession.stopRunning() if let metadataObject = metadataObjects.first { if let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject, let stringValue = readableObject.stringValue { // 传递扫码结果到回调闭包 onScanCompleted?(stringValue) // 根据跳转方式返回原页面 if presentingViewController != nil { dismiss(animated: true) } else { navigationController?.popViewController(animated: true) } } } } }
2. 修改原页面控制器(BarcodeViewController)
import UIKit class BarcodeViewController: UIViewController { @IBOutlet weak var scannedCodeTextField: UITextField! override func viewDidLoad() { super.viewDidLoad() } // 跳转到扫码页面时设置回调 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let scannerVC = segue.destination as? BarcodeScannerViewController { scannerVC.onScanCompleted = { [weak self] code in self?.scannedCodeTextField.text = code } } } }
注意事项
- 确保
BarcodeViewController到BarcodeScannerViewController的segue已正确创建(如果用segue跳转); - 用
[weak self]避免循环引用; - 跳转方式如果是代码push/present,也要在跳转代码中设置
onScanCompleted闭包; - 返回页面时,根据跳转方式选
dismiss(对应present)或popViewController(对应push)。
内容的提问来源于stack exchange,提问作者Fabian_Olczak
相关产品推荐
相关产品推荐

