我正在使用來自AppCoda的QR碼閱讀器代碼(http://www.appcoda.com/qr-code-reader-swift/#comments)並將其轉換爲Swift 3.基本代碼完美無缺。iOS QR碼掃描器多次觸發動作
但是,我想要實現的是從QR閱讀器中檢索字符串,將其存儲在一個變量中,並將該變量傳遞給以下視圖控制器。所以我添加一些代碼,以它得到以下幾點:
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
if metadataObjects == nil || metadataObjects.count == 0 {
qrCodeFrameView?.frame = CGRect.zero
messageLabel.text = "No barcode/QR code is detected"
return
}
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if supportedBarCodes.contains(metadataObj.type) {
let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
qrCodeFrameView?.frame = barCodeObject!.bounds
if metadataObj.stringValue != nil {
messageLabel.text = metadataObj.stringValue
}
//
//
// CODE I ADDED STARTS BELOW
//
performSegue(withIdentifier: "showMenu", sender: self)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showMenu"{
let tabVc = segue.destination as! UITabBarController
let navVc = tabVc.viewControllers?.first as! UINavigationController
let menuVc = navVc.viewControllers.first as! MenuViewController
menuVc.qrScan = self.messageLabel.text
}
它實際上是實現了我想要它做的事,但它在某種程度上觸發「performSegue」多次。第一個賽格的過渡動畫進行到一半,然後發生第二個。
segue「showMenu」是從QR Reader視圖的視圖控制器連接到包含導航控制器和菜單視圖控制器的選項卡欄控制器的手動Segue。
事情我已經嘗試:在菜單視圖控制器的viewDidLoad中功能
打印傳遞變量。該字符串打印出來兩次。
在QR閱讀器視圖中添加隱藏按鈕,並將「showMenu」從視圖控制器到按鈕的連接連接更改。從代碼中刪除執行segue。在將相機固定到位以掃描qr碼時,按下按鈕即可執行預定功能,並且只會觸發一次。
使用與(2)相同的設置,我在掃描qr代碼時通過使用觸摸內部事件以編程方式觸發按鈕。賽格被觸發兩次。
增加了performSegue和if子句正上方的斷點。在我掃描了一些東西后,按下「繼續執行程序」按鈕,程序就會在兩個斷點之間循環。
如果有人能夠在這裏給我點點啓發,我會非常感激。預先感謝一羣幫忙。
感謝您的幫助。我測試了您的方法nd有效(當展開到另一個視圖時)。但是,從我在測試過程中發現的情況來看,只有在QR閱讀器之前將展開的View實例化時,此方法纔有效。不幸的是,在我的情況下,我的流程是這樣的:登錄 - > QR閱讀器 - >菜單,所以什麼也沒有發生時,調用unwind segue。我目前正在使用一個臨時修補程序,只需禁用動畫即可,因此看起來並不那麼麻煩。 – JustTro11
你會碰巧知道爲什麼會發生這種情況(segue被多次觸發)?並且爲什麼放鬆繼續沒有這個問題?最後,如果我不解決這個問題,我會有性能問題嗎?喜歡,有沒有2菜單視圖運行或什麼? – JustTro11