当QR扫描回调到达时,导航控制器为零



我在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)

避免崩溃。

最新更新