iOS ZXingWidget-在自己的ViewController.view中将ZXingWidgetViewController的视图用作子视图

问题描述 投票:2回答:3

我正在尝试使用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 uiviewcontroller subview zxing addsubview
3个回答
2
投票

所以答案很简单。

我使用的是iOS 5.0和ARC。 ZXing ViewController在方法内部本地实例化。由于无法查看ViewController本身,因此ARC在该方法的末尾设置了一个发行版,并释放了ViewController。由于ViewController已发布,因此由ViewController保留的视图也将被发布。已取消被调用,因为Main ViewController已经不存在,并且在nil指针上调用某些方法将导致BAD_ACCESS。

这里的解决方案是将ZXingViewController设置为全局强大属性。这样可以防止在该方法结束时立即释放该对象,因此只要ViewController处于活动状态,作为子视图添加到另一个ViewControllers视图的视图就将保留在内存中。


0
投票

您不应该将控制器视图添加为另一个视图的子视图。您应该使用各种UIViewController机制来展示控制器。

[通过执行您的操作,您违反了UIViewController合同。窗口小部件未显示viewWillAppearviewDidAppear等内容>

如果要在UIView / CALayer级别而不是UIViewController级别使用ZXing,请查看ZXing objc directory中的类。


0
投票

也尝试在.... h文件中使用...使此ZXingWidgetController * widController;还要对viewScanner设置clipToBounds为true。

© www.soinside.com 2019 - 2024. All rights reserved.