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

时间:2016-10-28 07:01:41

标签: ios objective-c cocoa-touch ios10

我正面临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

有人对此次崩盘有任何想法吗?

4 个答案:

答案 0 :(得分:1)

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

例如,如果您有类似这样的事情,那么(在Swift中):

      layer.addSublayer(start.layer)

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

      addSubview(start)

请查看MyCameraScannerViewController的代码,了解具有图层操作的视图,并添加所有必需的addSubview()。

答案 1 :(得分:0)

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

您的UI更新如下:

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

});

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您可以尝试以下代码并检查:

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

            });

    });