2013-12-22 88 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; 
       } 
      }; 

編輯:

嘗試使用條碼掃描器不異步,但我仍然得到同樣的味精。

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

如果使用異步,則必須在創建mobilebarcodescanner控制器之前切換到UI線程。 =>不要在這裏使用異步/等待。而是在掃描儀上使用延續任務。掃描 – Softlion

+0

@dcorbatta是的IOS 7+確實是發展中的目標。 –

回答

1

所以,你可以本地掃描QR。在iOS 7 AVFoundation能夠掃描QR。 看看doc

here有一個使用Xamarin的例子。

+0

查看我的問題編輯。 –

0

做這兩種工作:

  1. 顯示您settingsVC沒有動畫,也就是從呈現settingsVC的VC:

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

    [self.navigationController pushViewController:settingsVC 
                animated:NO]; 
    
  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視圖控制器。但是,在viewDidAppear中初始化zxing控制器時,正如他的回答中提到的@JosephChen所述,問題消失,掃描控制器正常顯示。 –

+0

如果你可以提供關於你的settingsVC設置的類型,方式和位置的附加信息,以及它是否是UINavigationController控制器,那麼它將會很有幫助。最後,我想知道如何在應用程序的開始初始化zxing控制器。 –

5

我認爲默認情況下,ZXing庫必須查找最頂層的NavigationController並嘗試從那裏展示模態視圖控制器。和你一樣,我已經在根模塊的頂部模態地呈現了另一個NavigationController。我可以通過更改構造函數來解決此問題:

var scanner = new MobileBarcodeScanner (this); 
var result = await scanner.Scan(); 

其中「this」是您實際調用掃描儀的ViewController。

相關問題