Ios 在视图之间转换时应用程序有时会崩溃:如何调试约束?

Ios 在视图之间转换时应用程序有时会崩溃:如何调试约束?,ios,animation,uiview,transition,nslayoutconstraint,Ios,Animation,Uiview,Transition,Nslayoutconstraint,我使用动画在视图之间执行转换。它有时起作用,有时也会导致崩溃,我不明白为什么。我的代码在@try-@catch块中,但在@catch中没有检索到异常。我只是得到一个带有SIGABRT信号和以下日志的应用程序崩溃: 2015-09-23 10:03:43.420我的应用[1510:528283]视图层次结构未为约束做好准备: 添加到视图时,约束项必须是该视图(或视图本身)的后代。如果在装配视图层次之前需要解决约束,则此操作将崩溃。中断-[UIView(UIConstraintBasedLayout

我使用动画在视图之间执行转换。它有时起作用,有时也会导致崩溃,我不明白为什么。我的代码在
@try-@catch
块中,但在
@catch
中没有检索到异常。我只是得到一个带有SIGABRT信号和以下日志的应用程序崩溃:

2015-09-23 10:03:43.420我的应用[1510:528283]视图层次结构未为约束做好准备: 添加到视图时,约束项必须是该视图(或视图本身)的后代。如果在装配视图层次之前需要解决约束,则此操作将崩溃。中断-[UIView(UIConstraintBasedLayout)\u viewHierarchyUnpreparedForConstraint:]以进行调试

2015-09-23 10:03:43.421我的应用程序[1510:528283]***中的断言失败-[UIView\u layoutEngine\u didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:],/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit/UIKit-3505.16/NSLayoutConstraint\u 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操作系统 9.0(13A344)报告版本:104

异常类型:SIGABRT异常代码:#0在0x34de0d24崩溃 线程: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夸脱芯
0x268BC09 0x268b4000+35849 25夸脱芯
0x268bc129 0x268b4000+33065 26夸脱芯
0x268BBDB 0x268b4000+32235 27夸脱芯
0x268b55bf 0x268b4000+5567 28芯基础
0x22eaa0f1 0x22df2000+753905 29芯基础
0x22ea83e7 0x22df2000+746471 30 CoreFoundation
0x22ea8825 0x22df2000+747557 31核心基金会
0x22dfb1e9 0x22df2000+37353 32 CoreFoundation
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 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


如果看不到代码,就很难调试实际问题。原因可能是:

  • 将约束添加到不是受约束类的超级视图的视图中
  • 您正在向尚未添加为子视图的视图添加约束,因此该约束不在视图层次结构中
至于修好它。我成功地创建了一个以这种方式崩溃的项目,并通过添加符号断点正确地发现了错误,正如错误所示:


所以,试试这个,看看你的问题是从哪里来的。

你需要向我们展示你在这方面做了什么code@dopcn当然,我编辑了我的问题您正在使用
[self.secView removeFromSuperview]删除superview两行之后,您将使用
[self.view sendSubviewToBack:self.secView]将其移到后面。你想做什么?@Abizern你说得对,不需要调用
[self.view sendSubviewToBack:self.secView]。。。实际上,该代码段并不完整,
secView
mainView
可以根据我的应用程序登录进行多次切换