Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS ZXingWidget-在自己的ViewController.view中使用ZXingWidgetViewController的视图作为子视图_Ios_Uiviewcontroller_Subview_Zxing_Addsubview - Fatal编程技术网

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

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 *

我正在尝试使用iOS zxing小部件进行二维码扫描。我有一个ViewController,它在我的UINavigationController中作为一个项目推送,或者从另一个ViewController以模式显示。此ViewController具有用于3个不同视图的分段控件。其中两个视图是加载简单网站的UIWebView,没有什么特别之处

选择内容如下所示:

- (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];
    }