在 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 时出错