Xamarin.Forms ZXing.Net.Mobile iOS 10 扫描结果后丢失当前页面

Xamarin.Forms ZXing.Net.Mobile loosing current page after scan result on iOS 10

我正在使用 Xamarin.Forms 并且我已经实施 ZXing.Net.Mobile 来扫描条形码。

在 Android 上它工作正常,在 iOS 10 读取条形码后函数 "OnScanResult" 被触发并执行关闭扫描的命令 Navigation.PopAsync()页面,但一秒钟后它也关闭了我显示结果的当前页面!

        MyTapScan.Tapped += async (sender, e) =>
        {                
            await MyBtScan.ScaleTo(1.20, 100, Easing.Linear);             
            await MyBtScan.ScaleTo(1, 100, Easing.Linear);
            await Task.Delay(50);
            //--------------------------------------------
            MyAppLib.MyAppUtilitiesBarCodeReader MyBarCodeReader = new MyAppLib.MyAppUtilitiesBarCodeReader();                                
            var MyScannerPage = MyBarCodeReader.GetBarCodeReaderPage();
            //--------------------------------------------
            MyScannerPage.OnScanResult += (result) => {
                //Stop scanning
                MyScannerPage.IsScanning = false;
                //Pop the page and show the result
                Device.BeginInvokeOnMainThread(() => {
                    Navigation.PopAsync();
                    MyMachSerialNumber.Text = result.Text;
                });
            };
            //--------------------------------------------
            //Display scanner
            await Navigation.PushAsync(MyScannerPage);
        };

请帮助..!! :)

每次调用 MyTapScan.Tapped 时,您都会订阅 MyScannerPage.OnScanResult,因此如果您点击按钮 5 次,您的 OnScanResult 将被调用 5 次。我希望你现在知道如何解决这个问题了。

可能的解决方案之一: 获取您的 OnScanResult 委托并使其成为独立的函数,比如说 ScanFinished。然后代替

MyScannerPage.OnScanResult += (result)

MyScannerPage.OnScanResult -= ScanFinished; 
MyScannerPage.OnScanResult += ScanFinished; 

那么您可以确定该事件在您再次订阅之前已取消订阅

我引入了一个新变量来检查扫描是否已经启动,现在它工作正常并符合预期。 这是代码:

MyTapScan.Tapped += async (sender, e) =>
        {                
            await MyBtScan.ScaleTo(1.20, 100, Easing.Linear);             
            await MyBtScan.ScaleTo(1, 100, Easing.Linear);
            await Task.Delay(50);
            bool MyIsScanning = true;
            //--------------------------------------------
            MyAppLib.MyAppUtilitiesBarCodeReader MyBarCodeReader = new MyAppLib.MyAppUtilitiesBarCodeReader();                                
            var MyScannerPage = MyBarCodeReader.GetBarCodeReaderPage();
            //--------------------------------------------
            MyScannerPage.OnScanResult += (result) => {
                //Stop scanning
                MyScannerPage.IsScanning = false;
                //Pop the page and show the result
                Device.BeginInvokeOnMainThread(() => {
                    if (MyIsScanning == true)
                    {
                        MyIsScanning = false;
                        MyMachSerialNumber.Text = result.Text;
                        Navigation.PopAsync();
                    }                                                
                });
            };
            //--------------------------------------------
            //Display scanner
            await Navigation.PushAsync(MyScannerPage);
        };