MonoTouch, ZXing: presentando error ZXingScannerViewController

Por lo tanto, al comienzo de mi aplicación los usuarios tienen la capacidad de escanear un código QR. En la configuration de la aplicación, el usuario puede escanear otro código de barras para cambiar algunos datos dentro de la configuration.

Al principio de mi aplicación, el escáner funciona bien, pero cuando trato de escanear un código de barras dentro de la configuration de VC, recibo la siguiente Advertencia:

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

Ya intenté invocar el escaneo en viewDidAppear pero recibo la misma advertencia.

  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; } }; 

EDITAR:

Intenté usar el escáner de código de barras sin asíncrono, pero aún recibo el mismo post.

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

Y también intenté usar AVFoundation, lo que produjo el mismo error:

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

EDIT2:

Esta es una parte del flujo dentro de mi aplicación.

introduzca la descripción de la imagen aquí

Entonces, puedes escanear QR nativamente. En iOS 7 AVFoundation es capaz de escanear QR. Echa un vistazo al doc .

Y aquí hay un ejemplo con Xamarin.

Creo que, de forma pnetworkingeterminada, la biblioteca de ZXing debe estar buscando su control de navigation de nivel superior e intentar presentar el controller de vista modal desde allí. Al igual que usted, he presentado un nuevo NavigationController en la parte superior de la raíz. Pude arreglar esto cambiando el constructor para:

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

donde "esto" es el ViewController desde el que está llamando al escáner.

Haga uno de estos trabajos:

  1. Muestra tu settingsVC sin animation, es decir, desde el VC que presenta la settingsVC :

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

    o

     [self.navigationController pushViewController:settingsVC animated:NO]; 
  2. Use un retraso antes de mostrar el escáner, por ejemplo, en 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. }