You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中使用performSegue传值报错:无BarcodeSegue segue标识

扫码结果回传与Segue错误修复

错误原因

你碰到的NSInvalidArgumentException是因为两个问题:

  1. Storyboard中没有创建BarcodeScannerViewController到BarcodeViewController的segue,或者创建了但未设置标识符为BarcodeSegue;
  2. 核心逻辑错误:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:50:07