контроллер навигации равен нулю, когда приходит обратный вызов qr scan - PullRequest
0 голосов
/ 21 мая 2019

У меня есть реализация сканера 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, приложение не падает.

1 Ответ

0 голосов
/ 21 мая 2019

Ваш контроллер не добавлен в подкласс UINavigationController, поэтому self.navigationController равен nil (использование '!' С переменной nil приведет к сбою, и это произошло для вас)

Я думаю, что ваша функция scannedData все еще вызывается после вызова stopSession (), вы должны добавить флаг (например, остановленный) и добавить тест для этого флага в вашей функции scannedData.

Также я думаю, что вам нужно изменить

self.navigationController!.popViewController(animated: true)

с

self.navigationController?.popViewController(animated: true)

чтобы избежать сбоев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...