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

问题描述:

我在iOS 10中遇到了一个奇怪的崩溃问题; iOS 9的效果很好。当从当前视图控制器模态地呈现相机视图控制器时,它崩溃。在iOS 10中以模态方式呈现新的VC时发生崩溃

这是代码的崩溃行:

- (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 

任何人有关于这个崩溃的任何想法?

+1

你可以添加这个类的整个代码吗? –

+0

@KeyurHirani添加完整的方法。 – Abhinav

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

做你的UI更新,如:

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

}); 
+0

我已经试过这个,但没有收获。 – Abhinav

+0

@Abhinav你能用更多的代码更新你的问题吗? –

+0

我已经添加了整个方法。 – Abhinav

按照您发布的崩溃错误说:UIViewReportBrokenSuperviewChain。这意味着,这个问题是与视图2添加视图1层(其中视图1没有任何上海华盈)

请张贴更多的代码,以确定问题更清楚

+0

谢谢@Sharpkits。我已经添加了完整的方法。 – Abhinav

+0

@Abhinav我无法从你更新的代码中获得太多..但似乎self.searchOverlay是一个问题。检查这个链接,你可能会发现解决方案http://*.com/questions/39565424/swift-uiviewreportbrokensuperviewchain-cause-by-layer-manipulation –

你可以试试下面的代码,并检查:

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

      }); 

    }); 

你有这个错误,因为你正在处理其图层的一个UI项目没有附加到视图树。

对于为例(它在SWIFT),如果你有这样的事情:

 layer.addSublayer(start.layer) 

你必须绝对确保UI元素开始已经在视图层次结构如下:

 addSubview(start) 

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

+0

这解决了我的问题。你知道为什么你不能将视图的图层添加到子视图的图层吗?这可以在设备上运行,但当我尝试运行时会在模拟器中崩溃。你有什么可以分享的链接来阐述这个吗? – smileBot