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

我正在使用Xamarin.Forms,我已经实现了ZXing.Net.Mobile扫描条形码。

在Android上它工作正常,在iOS 10上读取条形码后,会触发函数“OnScanResult”并执行closures扫描页面的命令Navigation.PopAsync(),但是在closures之后,它也closures当前显示结果的页面!

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,因此如果您点击button5次,您的OnScanResult将被调用5次。 我希望现在你知道如何解决这个问题。

可能的解决scheme之一:把你的OnScanResult委托,并使其单独的function,让说ScanFinished。 然后,而不是

MyScannerPage.OnScanResult += (result)

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

然后,您可以确保事件取消订阅,然后再次订阅

我已经引入了一个新的variables来检查扫描是否已经被解雇,现在工作正常,如预期。 这是代码:

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