MonoTouch,ZXing:扫描后重定向到另一个ViewController

时间:2013-07-11 09:21:09

标签: ios xamarin.ios zxing xamarin

我正在使用ZXing MobileScanner lib和我的iOS for Xamarin项目(MonoTouch)。 我设置扫描,它工作正常,读取我的QRCode并得到正确的结果。 在阅读了QRCode之后,我想展示另一个ViewController。我在第二个控制器中设置了一个属性,其中包含扫描结果,然后想要显示控制器。

第二个视图未显示在屏幕上。没有错误,没有反馈,根本没有显示。 我想,MobileScanner构建了自己的View(可以在lib的源代码中看到)并将其添加到NavigationController中 - 这会导致我的Controller保持“落后”。通过按钮点击简单地重定向到我的控制器进行测试工作正常。 我还尝试通过调用scanner.Cancel()来“处理”视图,但这会导致

Warning: Attempt to dismiss from view controller <UINavigationController: 0x19a0c60> while a presentation or dismiss is in progress!

以下是我的代码,有关如何显示我的观点的任何帮助表示赞赏。

public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        // Perform any additional setup after loading the view, typically from a nib.

        scanner = new MobileBarcodeScanner(this.NavigationController);

        this.btnScan.TouchUpInside += (sender, e) => {

            //Tell our scanner to use the default overlay
            scanner.UseCustomOverlay = false;
            //We can customize the top and bottom text of the default overlay
            scanner.TopText = "Ticket vor den Scanner halten";
            scanner.BottomText = "Code wird automatisch eingelesen";

            //Start scanning
            scanner.Scan ().ContinueWith((t) => 
                                         {
                //Our scanning finished callback
                if (t.Status == System.Threading.Tasks.TaskStatus.RanToCompletion){
                    string msg = "";
                    ZXing.Result result = t.Result;

                    if (result != null && !string.IsNullOrEmpty (result.Text)) {

                        scanner.Cancel();

                        if(this.ticketScreen == null) {
                            this.ticketScreen = new TicketScreen();
                        } 

                        this.ticketScreen.ticketUrl = result.Text;
                        this.NavigationController.PushViewController(this.ticketScreen, true);

                    } else {
                        msg = "Code nicht erkannt!";
                        this.InvokeOnMainThread(() => {
                            var av = new UIAlertView("Fehler!", msg, null, "OK", null);
                            av.Show();
                        });
                    }
                }
            });


        };


    }

1 个答案:

答案 0 :(得分:0)

我使用 this.InvokeOnMainThread(() ,它在我的代码中运行正常。 您的解决方案是:

public override void ViewDidLoad()     {         base.ViewDidLoad();

    // Perform any additional setup after loading the view, typically from a nib.

    scanner = new MobileBarcodeScanner(this.NavigationController);

    this.btnScan.TouchUpInside += (sender, e) => {

        //Tell our scanner to use the default overlay
        scanner.UseCustomOverlay = false;
        //We can customize the top and bottom text of the default overlay
        scanner.TopText = "Ticket vor den Scanner halten";
        scanner.BottomText = "Code wird automatisch eingelesen";

        //Start scanning
        scanner.Scan ().ContinueWith((t) => 
                                     {
            //Our scanning finished callback
            if (t.Status == System.Threading.Tasks.TaskStatus.RanToCompletion){
                string msg = "";
                ZXing.Result result = t.Result;

                if (result != null && !string.IsNullOrEmpty (result.Text)) {

                    scanner.Cancel();

        this.InvokeOnMainThread(() => 
            {
              if(this.ticketScreen == null) {
                    this.ticketScreen = new TicketScreen();
                } 

                this.ticketScreen.ticketUrl = result.Text;
                this.NavigationController.PushViewController(this.ticketScreen, true);

        });



                } else {
                    msg = "Code nicht erkannt!";
                    this.InvokeOnMainThread(() => {
                        var av = new UIAlertView("Fehler!", msg, null, "OK", null);
                        av.Show();
                    });
                }
            }
        });


    };


}