MonoTouch,ZXing:呈现ZXingScannerViewController失败

时间:2013-12-22 16:53:15

标签: ios uinavigationcontroller xamarin.ios xamarin zxing

因此,在我的应用程序开始时,用户必须能够扫描QR码。在应用程序设置中,用户可以扫描另一个条形码以更改设置中的某些数据。

在我的应用程序开始时,扫描仪工作正常,但当我尝试扫描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

3 个答案:

答案 0 :(得分:5)

我认为默认情况下,ZXing库必须寻找最顶级的NavigationController并尝试从那里呈现模态视图控制器。和你一样,我已经在根目录的顶部模拟地呈现了另一个NavigationController。我能够通过将构造函数更改为:

来解决此问题
var scanner = new MobileBarcodeScanner (this);
var result = await scanner.Scan ();

其中&#34;这个&#34;是实际调用扫描程序的ViewController。

答案 1 :(得分:1)

因此,您可以原生扫描QR。在iOS 7中,AVFoundation能够扫描QR。 看看doc

here有一个使用Xamarin的例子。

答案 2 :(得分: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.
    }