2017-03-02 5 views
1

AppCoda (http://www.appcoda.com/qr-code-reader-swift/#comments)의 QR 코드 판독기 코드를 사용하여 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보기의보기 컨트롤러에서 탐색 컨트롤러와 메뉴보기 컨트롤러가있는 탭 막대 컨트롤러에 연결된 수동 섹 션입니다.

상황은 나는 시도했다 :

  1. 인쇄 메뉴보기 컨트롤러의 viewDidLoad에 기능에 변수 전달. 문자열이 두 번 인쇄됩니다.

  2. QR 판독기보기에 숨겨진 단추를 추가하고보기 컨트롤러에서 "showMenu"의 segue 연결을 단추로 변경합니다. 코드에서 segue 수행을 제거했습니다. qr 코드를 스캔하기 위해 카메라를 잡고있는 상태에서 버튼을 누르면 의도 한 기능이 수행되고 segue는 한 번만 트리거됩니다.

  3. (2)와 동일한 설정으로 qr 코드를 스캔 할 때 내부적으로 위로 터치 이벤트를 사용하여 프로그래밍 방식으로 단추를 트리거합니다. segue가 두 번 실행됩니다.

  4. performSegue에 대한 중단 점과 그 바로 위에있는 if 절이 추가되었습니다. 뭔가를 스캔하고 "프로그램 실행 계속"버튼을 누르면 프로그램은 두 개의 중단 점 사이를 반복합니다.

누구나 나를 조금이라도 계몽 할 수 있다면, 나는 매우 감사 할 것입니다. 사전에 도와 줘서 고마워.

답변

2

:.

self.captureSession?.stopRunning() 

그러나, SEGUE을 긴장하지 않는 이유에 대한 의문은 여전히 ​​비슷한 문제가를 남아 있습니다.

0

방금 ​​같은 문제가 해결되었습니다. 이전보기를 풀어야합니다.

인터페이스 빌더에서이를 수행하려면 컨트롤러에서 Ctrl 키를 누른 채로 실제로 컨트롤러에있는 종료점으로 드래그해야합니다 (unwind하려는 것이 아닌).

이 작업을 완료하면 식별자를이 unwind segue (예 : "showMenu")에 설정해야합니다. 이렇게하려면 왼쪽 부분의 장면 메뉴에서 풀기 (segue)를 풀고 식별자 특성 관리자에 이름 SEGUE을 수행 한 후이 문제는 다음 코드 줄을 추가하여 고정

+0

도움 주셔서 감사합니다. 귀하의 방법을 테스트했습니다. 그것은 (다른보기로 풀 때) 작동합니다. 그러나, 테스트 중에 찾은 내,이 메서드는 경우에만 unwind있는 QR 판독기 전에 인스턴스화 된 경우 작동합니다.불행하게도, 나의 경우, 나의 흐름은 login -> QR reader -> Menu와 비슷하다. 그래서 unwind segue가 호출 될 때 아무 일도 일어나지 않는다. 나는 현재 애니메이션을 단순히 비활성화하여 버그 수정하지 않고 임시 픽스를 사용하고 있습니다. – JustTro11

+0

왜 이런 일이 일어나고 있는지 알고 싶습니까? (여러 번 실행되는 segue)? 그리고 왜이 문제가 발생하지 않는가? 마지막으로,이 문제를 해결하지 않으면 성능 문제가 있습니까? 실제로 실제로 실행중인 2 개의 메뉴보기 또는 무엇입니까? – JustTro11