我正在尝试使用iOS zxing小部件进行QR码扫描。我有一个ViewController,它作为项目推送到我的UINavigationController中,或从另一个ViewController模态呈现。该ViewController具有用于3个不同视图的SegmentedControl。其中两个视图是UIWebViews,它们加载简单的网站,对此没有什么特别的。
选择看起来像这样:
- (IBAction)segmentedControlValueChanged:(id)sender {
NSString *urlString;
ZXingWidgetController *widController;
QRCodeReader* qrcodeReader;
NSSet *readers;
switch (segmentedControl.selectedSegmentIndex) {
case 0:
[self.view bringSubviewToFront:self.productSearchWebView];
urlString = [[SACommunicationService sharedCommunicationService] getURLforKey:kURLTypeProductSearch];
[self.productSearchWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];
break;
case 1:
[self.view bringSubviewToFront:self.marketSearchWebView];
urlString = [[SACommunicationService sharedCommunicationService] getURLforKey:kURLTypeMarketSearch];
[self.marketSearchWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];
break;
case 2:
widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];
qrcodeReader = [[QRCodeReader alloc] init];
readers = [[NSSet alloc] initWithObjects:qrcodeReader,nil];
widController.readers = readers;
[self.QRCodeScannerView addSubview:widController.view];
[self.view bringSubviewToFront:self.QRCodeScannerView];
break;
default:
break;
}
}
我尝试调试并逐步查找问题出处:
解码器(属于基础ZXing逻辑的一部分)尝试从其委托(应为ZXingWidgetController类)调用“ failedToDecodeImage:”并崩溃(EXC_BAD_ACCESS)
在逐步执行过程中,我发现调用了ZXingWidgetController的“已取消”方法。现在,我真的不知道为什么调用此方法。初始化并启动解码器后,Widget不应立即停止。
所以答案很简单。
我使用的是iOS 5.0和ARC。 ZXing ViewController在方法内部本地实例化。由于无法查看ViewController本身,因此ARC在该方法的末尾设置了一个发行版,并释放了ViewController。由于ViewController已发布,因此由ViewController保留的视图也将被发布。已取消被调用,因为Main ViewController已经不存在,并且在nil指针上调用某些方法将导致BAD_ACCESS。
这里的解决方案是将ZXingViewController设置为全局强大属性。这样可以防止在该方法结束时立即释放该对象,因此只要ViewController处于活动状态,作为子视图添加到另一个ViewControllers视图的视图就将保留在内存中。
您不应该将控制器视图添加为另一个视图的子视图。您应该使用各种UIViewController
机制来展示控制器。
[通过执行您的操作,您违反了UIViewController
合同。窗口小部件未显示viewWillAppear
,viewDidAppear
等内容>
如果要在UIView
/ CALayer
级别而不是UIViewController
级别使用ZXing,请查看ZXing objc directory中的类。
也尝试在.... h文件中使用...使此ZXingWidgetController * widController;还要对viewScanner设置clipToBounds为true。