【问题标题】:Crash while presenting a new VC modally in iOS 10在 iOS 10 中以模态方式呈现新 VC 时崩溃
【发布时间】: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 添加了完整的方法。

标签: ios objective-c cocoa-touch ios10


【解决方案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 是个问题。查看此链接,您可能会找到解决方案stackoverflow.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];

            });

    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多