Redlaser SDK 和 nil 模态视图控制器

Posted

技术标签:

【中文标题】Redlaser SDK 和 nil 模态视图控制器【英文标题】:Redlaser SDK and nil modal view controller 【发布时间】:2013-10-03 19:45:27 【问题描述】:

自从升级到 XCode 5/ios 7 后,我在调用应该显示 Redlaser SDK 条形码选择器控制器的函数时遇到以下错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标上呈现一个 nil 模态视图控制器。” * 先抛出调用栈:

(

0   CoreFoundation                      0x02ef25e4 __exceptionPreprocess + 180

1   libobjc.A.dylib                     0x028dd8b6 objc_exception_throw + 44

2   UIKit                               0x006e817a -[UIViewControllerpresentViewController:withTransition:completion:] + 4879

3   UIKit                               0x006e8caf -[UIViewController presentViewController:animated:completion:] + 130
4   UIKit                               0x006e8cef -[UIViewController presentModalViewController:animated:] + 56
5   Extinguishers                       0x0000b703 -[LoginViewController scanPressed] + 1299

这是我的方法导致它:

-(IBAction) scanPressed
   
if (overlayController.parentPicker == nil)

    BarcodePickerController * picker = [[BarcodePickerController alloc] init];

    [picker setOverlay:overlayController]; 
    [picker setDelegate:self];

    // Initialize with portrait mode as default
    picker.orientation = UIImageOrientationUp;

    // The active scanning region size is set in OverlayController.m


// Update barcode on/off settings
[overlayController.parentPicker setScanUPCE:YES];
[overlayController.parentPicker setScanEAN8:YES];
[overlayController.parentPicker setScanEAN13:YES];
//[overlayController.parentPicker setScanSTICKY:YES];
//[overlayController.parentPicker setScanQRCODE:YES];
[overlayController.parentPicker setScanCODE128:YES];
[overlayController.parentPicker setScanCODE39:YES];
[overlayController.parentPicker setScanITF:YES];

// Data matrix decoding does not work very well so it is disabled for now
[overlayController.parentPicker setScanDATAMATRIX:NO];

// hide the status bar
[[UIApplication sharedApplication] setStatusBarHidden:YES];

// Show the scanner overlay - THIS LINE CAUSES THE CRASH
    [self presentModalViewController:overlayController.parentPicker animated:TRUE];

我也试过升级到最新版本的Redlaser SDK,还是一样的错误。在切换到 iOS 7 作为基础 SDK 之前,我没有遇到这个问题。

【问题讨论】:

首先,presentModalViewController:animated: 在 iOS 6 中已被弃用。请尝试改用 presentViewController:animated:completion: 改成这样了,还是一样的错误。 尝试将您的选择器作为子视图添加到当前视图中,并执行一个bringviewfront 而不是作为模型呈现。只是一个解决方法 【参考方案1】:

我唯一能想到的是picker(父级)可能会超出范围并被释放。在错误行之前进行测试以检查父级是否仍然存在:if(overlayController.parentPicker == nil) NSLog(@"Parent is nil");

如果它真的是nil(就像你原来的错误所说的那样),请尝试在第一个if 声明之前声明picker 之前

BarcodePickerController *picker;
if(overlayController.parentPicker == nil)

    picker = [[BarcodePickerController alloc] init];
//...

子级可能只有一个指向父级的weak 指针,因此您可能需要将父级声明为@property 或在您的viewController 从堆栈中弹出之前不会被释放的某个位置。

【讨论】:

以上是关于Redlaser SDK 和 nil 模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

应用程序试图在目标上呈现一个 nil 模态视图控制器

ios:应用程序试图在目标上呈现一个 nil 模态视图控制器

** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“应用程序试图在目标上呈现一个 nil 模态视图控制器

应用程序试图在目标 <UIApplicationRotationFollowingController: 0x100c75280> 上呈现一个 nil 模态视图控制器

应用程序试图在 React Native Objective-C 扩展中的目标上呈现一个 nil 模态视图控制器

关闭模态,然后立即推视图控制器