У меня есть реализация сканера qr в ControllerA
, он получает обратные вызовы отсканированных данных. 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()
}
С потоком приложения я тестировал навигацию туда и обратно от этого контроллера к другому контроллеру. А между тем я сканирую код qr и мое приложение вылетает.
Когда я поставил логи, я обнаружил, что navigationController равен нулю.
Я знаю, что сканер qr постоянно сканирует изображение и вызывает делегата. Поэтому для этого я добавил stopSession
при сканировании действительного изображения, но все равно получаю два отсканированных результата непосредственно перед сбоем.
Я хочу знать, почему это происходит?
Когда я помещаю self.navigationController!.popViewController(animated: true)
в контроллер, который вызвал ControllerA
, приложение не падает.