我在ControllerA
中具有QR扫描仪的实现,它正在收回扫描数据的回调。QRScanner
是我的自定义类
extension QRScanner : AVCaptureMetadataOutputObjectsDelegate {
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
if metadataObjects.count == 0 {
self.delegate?.scannedData(QRScannerErrorCode.NoData.rawValue)
return
}
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if metadataObj.type == AVMetadataObject.ObjectType.qr {
self.stopSession()
if metadataObj.stringValue != nil {
if (validateCode!(metadataObj.stringValue!)) {
self.delegate!.scannedData(metadataObj.stringValue!)
}
}
}
}
}
我正在从上方收到Controller A
的回调。
extension ControllerA : QRScannerDelegate {
func scannedData(_ scannedString: String) {
if(validateData(scannedString: scannedString)) {
self.scanResult!.action = Action.SCAN
self.scanResult!.result = scannedString
assert(self.delegate != nil)
self.delegate!.result(result: self.scanResult!)
print("Nav stack:) (System.currentTimeMillis())")
self.navigationController!.popViewController(animated: true)
}
}
func validateData(scannedString: String) -> Bool {
return true
}
}
func stopSession() {
assert(session != nil && session!.isRunning)
self.session!.stopRunning()
}
随着应用的流量,我测试了从该控制器导航到另一个控制器。在i扫描QR码和我的应用程序崩溃之间。当我放入日志时,我发现navigation controller为nil。
我知道QR扫描仪会继续扫描图像并呼叫代表。因此,当扫描有效图像时,我添加了stopSession
,但在崩溃之前,我仍然可以背对两个扫描结果。
我想知道为什么会发生这种情况?
当我将self.navigationController!.popViewController(animated: true)
放在调用ControllerA
的控制器中时,该应用不会崩溃。
未将您的控制器添加到uinavigationController子类中,这就是为什么self.navigationcontroller为nil(使用nil变量使用'!',这将崩溃,这对您来说发生了什么(p>我认为您的扫描Data函数在调用stopsession((后仍会被调用,您必须添加标志(例如停止(,并在扫描data函数上添加该标志的测试。
我也认为您需要更改
self.navigationController!.popViewController(animated: true)
self.navigationController?.popViewController(animated: true)
避免崩溃。