gpt4 book ai didi

iOS ZXingWidget - 在自己的 ViewController.view 中使用 ZXingWidgetViewController 的 View 作为 subview

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:33 26 4
gpt4 key购买 nike

我正在尝试使用 iOS zxing Widget 进行二维码扫描。我有一个 ViewController,它作为一个项目推送到我的 UINavigationController 中,或者从另一个 ViewController 模态呈现。这个 ViewController 有一个用于 3 个不同 View 的 SegmentedControl。其中两个 View 是加载简单网站的 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 逻辑的一部分)试图从它的委托(delegate)(应该是 ZXingWidgetController 类)调用“failedToDecodeImage:”并崩溃(EXC_BAD_ACCESS)

在单步执行过程中,我发现调用了 ZXingWidgetController 的“已取消”方法。现在我真的不知道为什么调用这个方法。 Widget 不应在初始化和启动解码器后立即停止。

最佳答案

所以答案很简单。

我使用的是 iOS 5.0 和 ARC。 ZXing ViewController 在方法内部实例化。由于 ViewController 本身没有被查看,因此 ARC 在方法的末尾设置了一个释放并且 ViewController 被释放。由于 ViewController 被释放,被 ViewController 保留的 View 也将被释放。调用 Canceled 是因为 Main ViewController 不再存在并且在 nil 指针上调用某些方法会导致 BAD_ACCESS。

这里的解决方案是将 ZXingViewController 设置为全局强属性。这使得该对象不会在该方法结束时立即被释放,因此只要 ViewController 处于事件状态,作为 subview 添加到另一个 ViewControllers View 的 View 就会保留在内存中。

关于iOS ZXingWidget - 在自己的 ViewController.view 中使用 ZXingWidgetViewController 的 View 作为 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com