【问题标题】:passing a let value between classes / viewcontrollers in swift快速在类/视图控制器之间传递一个 let 值
【发布时间】:2016-05-27 18:59:35
【问题描述】:

我有一个包含各种类文件的项目。我有一个条形码扫描仪,我从在线资源中使用过它,它在警报控制器中输出值。我想做的是获取条形码值并将其传递回我的主类并使用函数解析它并将其显示在相关标签中。出于某种原因,如果有人有任何很棒的想法,我无法做到这一点。我花了一整天的时间试图弄清楚这一点,但没有任何运气。

barcodeScanner 类相关部分

/* AVCaptureMetadataOutputObjectsDelegate */

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

    if alertController != nil {
        return
    }

    if metadataObjects != nil && metadataObjects.count > 0 {
        if let machineReadableCode = metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
            // get the barcode string
            let type = machineReadableCode.type
            let barcode = machineReadableCode.stringValue

我需要将上面的条形码让值传递给乘客信息类,它将通过 submitCodeAuto 函数传递以写入标签。

            passengerInformation().self.submitCodeAuto(barcode)

我在上面的破解似乎不起作用..

            // display the barcode in an alert
            let title = "Barcode"
            let message = "Type: \(type)\nBarcode: \(barcode)"
            displayAlert(title, message: message)
        }

    }
}

}

乘客信息类

@IBOutlet weak var firstNameResponse: UILabel!
@IBOutlet weak var lastNameResponse: UILabel!

@IBAction func submitCodeAuto(sender: AnyObject!) {
   firstNameResponse.text = barcodeProtocol(barcode).firstName
   lastNameResponse.text = barcodeProtocol(barcode).lastName
}

submitCodeAuto 函数还通过另一个名为barcodeProtocol 的函数发送传入的条形码,该函数对其进行格式化以允许检索名字和姓氏。

我目前使用通过barcodeProtocol 运行文本字段值并显示在标签中的按钮测试标签,以便一切正常。

我还用可以正常工作的扫描仪类将一个按钮连接到一个新的视图控制器。显示相机扫描并显示值。

但我无法加入他们。应用程序返回致命错误:在展开可选值时意外发现 nil

任何帮助将非常感谢。

【问题讨论】:

  • 你搜索错误信息fatal error: unexpectedly found nil while unwrapping an Optional value了吗?您是否查看了 Xcode 中指出的问题行?你尝试过什么调试? StackOverflow 上有很多类似的问题。例如:stackoverflow.com/q/32170456/558933

标签: ios swift


【解决方案1】:

在你的函数中:

@IBAction func submitCodeAuto(sender: AnyObject!) {
   firstNameResponse.text = barcodeProtocol(barcode).firstName
   lastNameResponse.text = barcodeProtocol(barcode).lastName
}

你从哪里得到“条形码”?

尝试替换为

@IBAction func submitCodeAuto(sender: AnyObject!) {
   firstNameResponse.text = barcodeProtocol(sender as! String).firstName
   lastNameResponse.text = barcodeProtocol(sender as! String).lastName
}

我假设您的方法barcodeProtocol 接受任何字符串并将其完美解析为名字和姓氏

【讨论】:

    【解决方案2】:

    您的代码充满了问题。

    您从barcodeScanner 代码创建passengerInformation 类的新实例,调用submitCodeAuto() 方法,然后忘记新创建的passengerInformation 对象。 (大概是一个视图控制器。)

    创建一个新的视图控制器,向它发送消息,然后忘记它是没有意义的。那不会有任何作用。您可能希望从情节提要实例化您的自定义passengerInformation 视图控制器,在视图控制器中设置barcode 字符串属性,然后使用presentViewController:animated:completion: 以模态方式呈现它。在您的passengerInformation 视图控制器的 viewWillAppear 方法中,您应该获取条形码属性,从中提取您需要的信息,并将其安装到您的文本字段中。

    您的 submitCodeAuto() 方法被声明为 IBAction,即使您没有以这种方式使用它。它需要一个您忽略的参数sender,而是使用一个您未显示的变量barcode

    您的 submitCodeAuto() 函数可能应该采用 String 类型的参数 barcode,因为它似乎正在这样做。

    您有几个班级的班级名称以小写字母开头。类名应以大写字母开头。

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多