iOS ZXingWidget-在自己的ViewController.view中使用ZXingWidgetViewController的视图作为子视图
我正在尝试使用iOS zxing小部件进行二维码扫描。我有一个ViewController,它在我的UINavigationController中作为一个项目推送,或者从另一个ViewController以模式显示。此ViewController具有用于3个不同视图的分段控件。其中两个视图是加载简单网站的UIWebView,没有什么特别之处 选择内容如下所示:iOS ZXingWidget-在自己的ViewController.view中使用ZXingWidgetViewController的视图作为子视图,ios,uiviewcontroller,subview,zxing,addsubview,Ios,Uiviewcontroller,Subview,Zxing,Addsubview,我正在尝试使用iOS zxing小部件进行二维码扫描。我有一个ViewController,它在我的UINavigationController中作为一个项目推送,或者从另一个ViewController以模式显示。此ViewController具有用于3个不同视图的分段控件。其中两个视图是加载简单网站的UIWebView,没有什么特别之处 选择内容如下所示: - (IBAction)segmentedControlValueChanged:(id)sender { NSString *
- (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_访问)
在逐步执行时,我发现ZXingWidgetController的“取消”方法被调用。现在我真的不知道为什么会调用这个方法。小部件不应该在初始化和启动解码器后立即停止。您不应该将控制器视图添加为另一个视图的子视图。您可以使用各种
UIViewController
机制演示控制器
通过做你正在做的事情,你违反了UIViewController
合同。小部件没有获得类似于视图将出现
,视图显示
等内容
如果您想在
UIView
/CALayer
级别而不是UIViewController
级别使用ZXing,请查看。中的类,因此答案非常简单
我使用的是iOS 5.0和ARC。ZXing ViewController在方法内部本地实例化。因为ViewController本身没有被查看,所以在方法的末尾设置一个释放,ViewController被释放。由于ViewController已被释放,因此ViewController保留的视图也将被释放。调用Cancelled是因为主ViewController不再存在,并且对nil指针调用某些方法会导致错误的访问
这里的解决方案是将ZXingViewController设置为全局强属性。这使对象不会在该方法结束时被释放,因此作为子视图添加到另一个ViewControllers视图中的视图会一直保留在内存中,只要ViewControllers处于活动状态。试试这个。。。同样在.h文件中,使这个ZXingWidgetController*widController; 并将clipToBounds设置为true
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self performSelector:@selector(openScanner) withObject:nil afterDelay:0.5];
}
-(void)openScanner
{
self.widController = [[ZXingWidgetController alloc] initMiniWithDelegate:self showCancel:NO OneDMode:YES];
NSMutableSet *readers = [[NSMutableSet alloc ] init];
MultiFormatReader* reader = [[MultiFormatReader alloc] init];
[readers addObject:reader];
self.widController.readers = readers;
[viewScanner addSubview:self.widController.view];
}