2013-12-22 7 views
6

アプリケーションの開始時に、ユーザーはQRコードをスキャンする必要があります。アプリの設定では、ユーザーは別のバーコードをスキャンして、設定内の一部のデータを変更することができます。私のアプリケーションスキャナの初めにMonoTouch、ZXing:ZXingScannerViewControllerの表示に失敗しました

はうまく動作しますが、私は次の警告を得るsettingsVC内のバーコードをスキャンしようとすると:

Warning: Attempt to present ZXing.Mobile.ZXingScannerViewController: 0x18036dc0 on UINavigationController: 0x16d8afe0 whose view is not in the window hierarchy! 

は、私はすでにviewDidAppearにスキャンを起動しようとしましたが、私が取得します同じ警告。

  button_ScanAPI.TouchUpInside += async (sender, e) => { 
       var scanner = new ZXing.Mobile.MobileBarcodeScanner(); 
       var result = await scanner.Scan(); 

       if (result != null) { 
        textField_APIKey.Text = result.Text; 
       } 
      }; 

EDIT:

は非同期ずにバーコードスキャナを使用しようとしましたが、私はまだ同じMSGを取得します。

var scanner = new ZXing.Mobile.MobileBarcodeScanner(); 
       scanner.Scan (true).ContinueWith (t => { 
        if (t.Result != null) { 

         InvokeOnMainThread (() => { 
          textField_APIKey.Text = t.Result.Text; 

         }); 
        } 
       }); 

そして、私も同じエラーが生じAVFoundationを使用してみました:

Warning: Attempt to present <AVCaptureScannerViewController: 0x16fb1d00> on <UINavigationController: 0x16ebe790> whose view is not in the window hierarchy! 

EDIT2:これは私のアプリ内の流れの一部である

enter image description here

+0

バージョンの対象は何ですか? iOS 7+用に開発していますか? – dcorbatta

+0

asyncを使用する場合は、mobilebarcodescannerコントローラを作成する前にUIスレッドに切り替える必要があります。 =>ここでは非同期/待機を使用しないでください。代わりにスキャナ上で継続タスクを使用してください。Scan – Softlion

+0

@dcorbattaはい、IOS 7+が実際に開発目標です。 –

答えて

1

だから、あなたはネイティブQRをスキャンすることができます。 iOS 7では、AVFoundationはQRをスキャンすることができます。 docをご覧ください。

here Xamarinを使用した例があります。

+0

私の質問を編集します。 –

0

これらの作業のいずれかの操作を行います。

[self presentViewController:settingsVC 
        animated:NO 
       completion:nil]; 

または

[self.navigationController pushViewController:settingsVC 
            animated:NO]; 

  1. はすなわちsettingsVCを提示VCから、アニメーションせずにsettingsVCを表示します

  2. スキャナを表示する前に遅延を使用してください。 settingsVCに:

    - (void)viewDidAppear:(BOOL)animated 
    { 
        [super viewDidAppear:animated]; 
    
        NSTimeInterval delay = 0.3; 
        [self performSelector:@selector(showScanner) 
           withObject:nil 
           afterDelay:delay]; 
    } 
    
    - (void)showScanner 
    { 
        // Show scanner here. 
    } 
    
+0

これはまだscannerVCを表示せず、同じ警告を返します。 –

+0

settingsVCが実際にUINavigationControllerで、settingsVC viewDidLoadでzxingビューコントローラを初期化すると仮定して、私はほとんどあなたの問題を再現しました。しかし、彼の答えに記載されている@ JosephChenのように、viewDidAppear内のzxingコントローラを初期化すると、問題が解消され、スキャンコントローラが正常に表示されました。 –

+0

あなたがどのような種類、どのようにあなたのsettingsVCがセットアップされているか、UINavigationControllerならそれを押すコントローラについての追加情報を提供できれば役に立ちます。最後に、あなたのアプリの初めにzxingコントローラを初期化する方法を知りたいと思います。 –

5

私は、デフォルトでZXingライブラリが最上位のNavigationControllerを探していて、そこからモーダルビューコントローラを表示しようとしていると思います。あなたのように、私はモーダルに別のNavigationControllerをルートのトップに提示しました。

ここで、 "this"は実際にスキャナを呼び出すViewControllerです。これは、コンストラクタを変更することで解決できました。

関連する問題