2017-03-02 66 views
1

我正在使用來自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中功能

  1. 打印傳遞變量。該字符串打印出來兩次。

  2. 在QR閱讀器視圖中添加隱藏按鈕,並將「showMenu」從視圖控制器到按鈕的連接連接更改。從代碼中刪除執行segue。在將相機固定到位以掃描qr碼時,按下按鈕即可執行預定功能,並且只會觸發一次。

  3. 使用與(2)相同的設置,我在掃描qr代碼時通過使用觸摸內部事件以編程方式觸發按鈕。賽格被觸發兩次。

  4. 增加了performSegue和if子句正上方的斷點。在我掃描了一些東西后,按下「繼續執行程序」按鈕,程序就會在兩個斷點之間循環。

如果有人能夠在這裏給我點點啓發,我會非常感激。預先感謝一羣幫忙。

回答

2

的問題是固定的,加入下面的代碼行進行了SEGUE後:

self.captureSession?.stopRunning() 

然而,爲什麼不放鬆賽格瑞的問題也有類似的問題仍然

0

我剛剛解決了同樣的問題。您必須創建一個展望前一個視圖。

要在界面生成器中執行此操作,您必須從控制器拖動到控制器中實際位於的控制器(不是您想要放鬆的控制器)的出口。

一旦你完成了這一步,你必須設置一個標識符到這個展開segue(在你的情況下「showMenu」。要做到這一點,你必須從左側部分的場景菜單展開segue並設置標識符命名的屬性檢查

+0

感謝您的幫助。我測試了您的方法nd有效(當展開到另一個視圖時)。但是,從我在測試過程中發現的情況來看,只有在QR閱讀器之前將展開的View實例化時,此方法纔有效。不幸的是,在我的情況下,我的流程是這樣的:登錄 - > QR閱讀器 - >菜單,所以什麼也沒有發生時,調用unwind segue。我目前正在使用一個臨時修補程序,只需禁用動畫即可,因此看起來並不那麼麻煩。 – JustTro11

+0

你會碰巧知道爲什麼會發生這種情況(segue被多次觸發)?並且爲什麼放鬆繼續沒有這個問題?最後,如果我不解決這個問題,我會有性能問題嗎?喜歡,有沒有2菜單視圖運行或什麼? – JustTro11