二维扫描回调到来时导航控制器为零

时间:2019-05-21 09:54:18

标签: ios swift uinavigationcontroller

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

通过应用程序流程,我测试了从该控制器到另一个控制器的来回导航。在此之间,我扫描二维码,然后我的应用崩溃。 当我放置日志时,我发现navigationController为零。

我知道qr扫描仪会连续扫描图像并呼叫委托。因此,我在扫描有效图像时添加了stopSession,但仍然在崩溃前紧接返回两个扫描结果。

  

我想知道为什么会这样吗?

当我将self.navigationController!.popViewController(animated: true)放在调用ControllerA的控制器中时,该应用不会崩溃。

1 个答案:

答案 0 :(得分:0)

您的控制器未添加到UINavigationController子类中,这就是self.navigationController为nil的原因(使用带有nil变量的'!'会崩溃,而这对您而言是发生的事情)

我认为在调用stopSession()之后仍要调用您的scandData函数,您必须添加一个标志(例如已停止),并在您的scandData函数上对该标志添加测试。

我还认为你需要改变

Get-childitem "C:\Users\xx\test powershell script\*" -include *.jpg -recurse |% {

$nextName = Join-Path -Path 'C:\Users\xx\test powershell script\*' -ChildPath $_.name

while(Test-Path -Path $nextName)
{
   $nextName = Join-Path "C:\Users\xx\test powershell script" ($_.BaseName + "_$num" + $_.Extension)    
   $num+=1   
}

$ParentOjbect =$_.Directory
$Parent =$ParentOjbect.Name
$GrandParent = $ParentOjbect.Parent
$GreatGran = $GrandParent.Parent
$Extension = $_.Extension
$countRef = [ref] 0

Copy-item $_ -Destination (Join-Path "C:\Users\xx\test powershell script" ('{0}_{1}_{2}{3}' -f $GrandParent,$GreatGran,++$countRef.Value,$Extension))
}

使用

self.navigationController!.popViewController(animated: true)

避免崩溃。