在视图之间转换时应用程序有时会崩溃:如何调试约束?
Posted
技术标签:
【中文标题】在视图之间转换时应用程序有时会崩溃:如何调试约束?【英文标题】:App crashing sometimes when transitioning between views: how to debug constraints? 【发布时间】:2015-09-23 15:16:03 【问题描述】:我使用动画在视图之间执行转换。它有时会起作用,有时也会导致崩溃,我不明白为什么。我的代码在@try-@catch
块中,但在@catch
中没有检索到异常。我只是得到一个带有 SIGABRT 信号和以下日志的应用程序崩溃:
2015-09-23 10:03:43.420 My App[1510:528283] 视图层次结构没有为约束做好准备: 添加到视图时,约束的项必须是该视图(或视图本身)的后代。如果在组装视图层次结构之前需要解决约束,这将崩溃。中断 -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] 进行调试。
2015-09-23 10:03:43.421 我的应用程序[1510:528283] *** 断言失败 -[UIView _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:], /BuildRoot/Library/Caches/com.apple.xbs/来源/UIKit/UIKit-3505.16/NSLayoutConstraint_UIKitAdditions.m:590
我不明白为什么它有时会工作而有时会崩溃,我不明白如何调试它,请我帮忙。
提前致谢
编辑:
这似乎是导致应用崩溃的方法:
- (void)switchToMainView
[UIView transitionWithView:self.view
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromRight
animations:^
@try
if ([self.secView superview])
[self setMainView];
[self.secView removeFromSuperview];
[self.view addSubview:self.mainView];
[self.view sendSubviewToBack:self.secView];
@catch (NSException *exception)
NSLog(@"exception: %@", exception.description);
completion:^(BOOL finished)
if (finished)
@try
[self.view setNeedsUpdateConstraints];
[self setMessage];
@catch (NSException *exception)
NSLog(@"exception: %@", exception.description);
];
以及在完成块中调用的setMessage
方法:
- (void)setMessage
UIView *messageView = nil;
@try
messageView = [[[NSBundle mainBundle] loadNibNamed:@"MessageView" owner:nil options:nil] firstObject];
messageView.frame = CGRectMake(0, 0, self.messagesContainerView.frame.size.width, self.messagesContainerView.frame.size.height);
[self.messagesContainerView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];
[self.messagesContainerView addSubview:messageView];
@catch (NSException *exception)
NSLog(@"exception: %@", exception.description);
其中self.messagesContainerView
是第一种方法中self.mainView
的子视图。
再次感谢
编辑 2:
这是我设法获得的最后一次崩溃信息:
日期/时间:2015-09-24 10:01:13 +0000 操作系统版本:iPhone OS 9.0 (13A344) 报告版本:104
异常类型:SIGABRT 异常代码:#0 at 0x34de0d24 Crashed 线程:0
应用特定信息: *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法设置 视图层次结构的布局没有为约束做好准备。'
最后一个异常回溯:0 CoreFoundation 0x22ee786b 0x22df2000 + 1005675 1 libobjc.A.dylib 0x345e6dff 0x345e0000 + 28159 2 核心基础 0x22ee7741 0x22df2000 + 1005377 3 基础 0x23c772ab 0x23be0000 + 619179 4 UIKit 0x277ced17 0x26fe7000 + 8289559 5 UIKit 0x270f8b1b 0x26fe7000 + 1121051 6 UIKit 0x270f898d 0x26fe7000 + 1120653 7 UIKit 0x270f88a7 0x26fe7000 + 1120423 8 UIKit 0x277cee6d 0x26fe7000 + 8289901 9 UIKit 0x270f878f 0x26fe7000 + 1120143 10 我的应用程序 0x000423c5 0x11000 + 201669 11 UIKit 0x277d479d 0x26fe7000 + 8312733 12 基础 0x23c29c81 0x23be0000 + 302209 13 UIKit 0x270fbaa9 0x26fe7000 + 1133225 14 UIKit 0x277d49d9 0x26fe7000 + 8313305 15 UIKit 0x270fc78b 0x26fe7000 + 1136523 16 基础 0x23c29c81 0x23be0000 + 302209 17 UIKit 0x270fbaa9 0x26fe7000 + 1133225 18 UIKit 0x270fc487 0x26fe7000 + 1135751 19 UIKit 0x277d4fa5 0x26fe7000 + 8314789 20 UIKit 0x272edfa9 0x26fe7000 + 3174313 21 UIKit 0x26ff56bb 0x26fe7000 + 59067 22 石英芯 0x268c167d 0x268b4000 + 54909 23 石英核心 0x268bcd79 0x268b4000 + 36217 24 石英核心 0x268bcc09 0x268b4000 + 35849 25 石英核心 0x268bc129 0x268b4000 + 33065 26 石英核心 0x268bbdeb 0x268b4000 + 32235 27 石英核心 0x268b55bf 0x268b4000 + 5567 28 核心基础 0x22eaa0f1 0x22df2000 + 753905 29 核心基础 0x22ea83e7 0x22df2000 + 746471 30 核心基础 0x22ea8825 0x22df2000 + 747557 31 核心基础 0x22dfb1e9 0x22df2000 + 37353 32 核心基础 0x22dfafdd 0x22df2000 + 36829 33 图形服务 0x2c09faf9 0x2c096000 + 39673 34 UIKit 0x2706018d 0x26fe7000 + 496013 35 我的应用程序 0x000d7d69 0x11000 + 814441 36 libdyld.dylib 0x34d11873 0x34d0f000 + 10355
线程 0 崩溃:0 libsystem_kernel.dylib 0x34de0d24 0x34dcc000 + 85284 1 libsystem_c.dylib 0x34d78f51 0x34d2e000 + 307025 2 我的应用程序 0x001abebf 0x11000 + 1683135 3 核心基础 0x22ee7ba9 0x22df2000 + 1006505 4 libobjc.A.dylib 0x345e7087 0x345e0000 + 28807 5 libc++abi.dylib 0x33dcce17 0x33db6000 + 93719 6 libc++abi.dylib 0x33dcc8f7 0x33db6000 + 92407 7 libobjc.A.dylib 0x345e6f47 0x345e0000 + 28487 8 核心基础 0x22dfb26f 0x22df2000 + 37487 9 核心基础 0x22dfafdd 0x22df2000 + 36829 10 图形服务 0x2c09faf9 0x2c096000 + 39673 11 UIKit 0x2706018d 0x26fe7000 + 496013 12 我的应用程序 0x000d7d69 0x11000 + 814441 13 libdyld.dylib 0x34d11873 0x34d0f000 + 10355
【问题讨论】:
你需要向我们展示你在代码中做了什么 @dopcn 当然,我编辑了我的问题 您正在使用[self.secView removeFromSuperview];
删除一个超级视图,然后两行之后您将使用[self.view sendSubviewToBack:self.secView];
将其移到后面。你想做什么?
@Abizern 你说得对,应该不需要调用[self.view sendSubviewToBack:self.secView];
...其实sn-p这个代码是不完整的,secView
和mainView
可以切换几个根据我的应用逻辑的时间
所以你问题中的代码不完整?帮助您解决问题对我们没有多大用处。
【参考方案1】:
没有看到您的代码很难调试实际问题。可能的原因是:
您正在向不是受约束类的父视图的视图添加约束。 您正在向尚未添加为子视图的视图添加约束 - 因此不在视图层次结构中。至于修复它。我设法创建了一个以这种方式崩溃的项目,并通过添加符号断点正确地发现了错误:
所以试试这个,看看你的问题来自哪里。
【讨论】:
以上是关于在视图之间转换时应用程序有时会崩溃:如何调试约束?的主要内容,如果未能解决你的问题,请参考以下文章