在 iOS 10 中以模态方式呈现新 VC 时崩溃

Posted

技术标签:

【中文标题】在 iOS 10 中以模态方式呈现新 VC 时崩溃【英文标题】:Crash while presenting a new VC modally in iOS 10 【发布时间】:2016-10-28 07:01:41 【问题描述】:

我在 ios 10 中遇到了一个奇怪的崩溃问题; iOS 9 运行良好。从当前视图控制器模态显示相机视图控制器时,它会崩溃。

这是崩溃的代码行:

- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar 
    if (self.searchBar.isFirstResponder) 
        [self.searchBar resignFirstResponder];
    

    if (self.searchOverlay) 
        [self.searchOverlay removeView];
        self.searchOverlay = nil;
    

    MyCameraScannerViewController *aCameraScannerViewController = [[MyCameraScannerViewController alloc] initWithScanningMessage:@"Please point camera on barcode"];
    aCameraScannerViewController.delegate = self;
    aCameraScannerViewController.showTargetReticle = YES;

    [self.navigationController presentViewController:aCameraScannerViewController animated:YES completion:nil];

我因以下错误而崩溃:

2016-10-28 12:22:35.494135 MyApp[27308:8137793] *** Assertion failure in void UIViewReportBrokenSuperviewChain(UIView *__strong, UIView *__strong, BOOL)(), /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3599.6.1/UIView.m:190

有人知道这次崩溃吗?

【问题讨论】:

你能添加这个类的全部代码吗? @KeyurHirani 添加了完整的方法。 【参考方案1】:

您遇到此错误是因为您正在处理其层的一个 UI 项未附加到视图树。

例如(它在 Swift 中),如果你有这样的东西:

      layer.addSublayer(start.layer)

您必须绝对确定 UI 元素 start 已经在视图层次结构中,如下所示:

      addSubview(start)

因此,请查看 MyCameraScannerViewController 的代码以获取具有图层操作的视图并添加所有必需的 addSubview()。

【讨论】:

这解决了我的问题。你知道为什么不能将视图的图层添加到子视图的图层吗?这适用于设备,但当我尝试运行它时在模拟器中崩溃。你有什么可以分享的链接来解释这个吗?【参考方案2】:

看起来您正在从后台线程调用presentViewController。所有 UI 活动都必须发生在主线程上。

您的 UI 更新如下:

dispatch_async(dispatch_get_main_queue(), ^
    [navigationController presentViewController:cameraViewController animated:YES completion:nil];

);

【讨论】:

@Abhinav 你能用更多代码更新你的问题吗? 我已经添加了整个方法。【参考方案3】:

根据您发布的崩溃错误说 UIViewReportBrokenSuperviewChain 。这意味着问题在于在 View2 上添加一层 View1(其中 View1 没有任何超级视图)

请发布更多代码以更清楚地识别问题

【讨论】:

感谢@Sharpkits。我已经添加了完整的方法。 @Abhinav 我无法从您更新的代码中获得太多信息……但似乎 self.searchOverlay 是个问题。查看此链接,您可能会找到解决方案***.com/questions/39565424/…【参考方案4】:

你能试试下面的代码并检查一下吗:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
            dispatch_async(dispatch_get_main_queue(), ^

                [navigationController presentViewController:cameraViewController animated:YES completion:nil];

            );

    );

【讨论】:

以上是关于在 iOS 10 中以模态方式呈现新 VC 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Google 和 Facebook 登录控制器在 Xcode 11 iOS 13 中以模态方式呈现

Xcode 11.1 查看控制器在当前 VC 下可见时以模态方式呈现

应用程序不会以模态方式呈现,但崩溃与`应用程序试图以模态方式呈现活动控制器`

以模态方式呈现 UIImagePickerController 时出错

Cocoa - 在情节提要中以编程方式呈现 NSViewController LIKE “显示选项”(不是模态)

iOS UISearchController 崩溃:应用程序试图在自身上呈现模态视图控制器