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);
};
我正在使用 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);
};