【问题标题】:Tracking NSLayoutConstraint Crash?跟踪 NSLayoutConstraint 崩溃?
【发布时间】:2015-09-18 12:15:32
【问题描述】:

我对 iOS9 中出现的一些 NSLayoutConstraint 设置有疑问(我认为)。无论如何,我收到以下控制台错误:

这个 NSLayoutConstraint 被配置了一个常量 超过内部限制。将替换一个较小的值,但 这个问题应该得到解决。打破虚无 _NSLayoutConstraintNumberExceedsLimit() 进行调试。这将只记录一次。这可能会在未来中断。

接着是:

* 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'* +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: 不能在前导/尾随属性和 右/左属性。两者都使用前导/尾随,或都不使用。'

然后是一堆堆栈信息:

*** First throw call stack:
(
    0   CoreFoundation                      0x0000000102b3af65 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001025aedeb objc_exception_throw + 48
    2   CoreFoundation                      0x0000000102b3ae9d +[NSException raise:format:] + 205
    3   Foundation                          0x0000000102177e82 +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:] + 299
    4   My App                            0x000000010011f429 -[APStatisticsAverageFlightDuration viewDidInit] + 2841
    5   My App                            0x000000010011e909 -[APStatisticsAverageFlightDuration awakeFromNib] + 73
    6   UIKit                               0x000000010328752e -[UINib instantiateWithOwner:options:] + 2416
    7   UIKit                               0x000000010307284d -[UIViewController _loadViewFromNibNamed:bundle:] + 381
    8   UIKit                               0x0000000103073179 -[UIViewController loadView] + 178
    9   UIKit                               0x00000001032aad85 -[UITableViewController loadView] + 84
    10  UIKit                               0x000000010307347c -[UIViewController loadViewIfRequired] + 139
    11  UIKit                               0x0000000103073c7d -[UIViewController view] + 27
    12  UIKit                               0x00000001037ded8e __67-[UIStoryboardEmbedSegueTemplate newDefaultPerformHandlerForSegue:]_block_invoke + 524
    13  UIKit                               0x00000001035cf189 -[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 460
    14  UIKit                               0x00000001035cef8c -[UIStoryboardSegueTemplate _perform:] + 82
    15  UIKit                               0x00000001035cf250 -[UIStoryboardSegueTemplate perform:] + 156
    16  UIKit                               0x0000000103073687 -[UIViewController loadViewIfRequired] + 662
    17  UIKit                               0x00000001030b6c26 -[UINavigationController _layoutViewController:] + 54
    18  UIKit                               0x00000001030b74dd -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 433
    19  UIKit                               0x00000001030b7633 -[UINavigationController _startTransition:fromViewController:toViewController:] + 116
    20  UIKit                               0x00000001030b8879 -[UINavigationController _startDeferredTransitionIfNeeded:] + 890
    21  UIKit                               0x00000001030b967d -[UINavigationController __viewWillLayoutSubviews] + 57
    22  UIKit                               0x000000010325163d -[UILayoutContainerView layoutSubviews] + 248
    23  UIKit                               0x0000000102f9911c -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 710
    24  QuartzCore                          0x000000010146f36a -[CALayer layoutSublayers] + 146
    25  QuartzCore                          0x0000000101463bd0 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
    26  QuartzCore                          0x0000000101463a4e _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    27  QuartzCore                          0x00000001014581d5 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
    28  QuartzCore                          0x00000001014859f0 _ZN2CA11Transaction6commitEv + 508
    29  UIKit                               0x0000000102f1253a _afterCACommitHandler + 174
    30  CoreFoundation                      0x0000000102a669d7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    31  CoreFoundation                      0x0000000102a66947 __CFRunLoopDoObservers + 391
    32  CoreFoundation                      0x0000000102a5c59b __CFRunLoopRun + 1147
    33  CoreFoundation                      0x0000000102a5be98 CFRunLoopRunSpecific + 488
    34  GraphicsServices                    0x0000000106016ad2 GSEventRunModal + 161
    35  UIKit                               0x0000000102ee8676 UIApplicationMain + 171
    36  My App                            0x000000010026c2cf main + 111
    37  libdyld.dylib                       0x000000010491f92d start + 1
    38  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我应该如何追踪导致问题的约束?我有几十个。我添加了_NSLayoutConstraintNumberExceedsLimit() 断点,它让我停在这一行:

NSArray *constraintAircraftV = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[xLabelsCV(==lblCvHeight)]-spacing-[timePeriodCV(==timePeriodCvHeight)]-spacing-[aircraftCV(==aircraftCvHeight)]" options:0 metrics:metrics views:views];

我应该如何解决问题所在?代码没有改变,但在 iOS9 更新时它刚刚停止工作。

【问题讨论】:

    标签: ios objective-c stack nslayoutconstraint


    【解决方案1】:

    这是一个新的 iOS 9 问题。 替换:

    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.skipButton attribute:NSLayoutAttributeTrailling relatedBy:NSLayoutRelationEqual toItem:self **attribute:NSLayoutAttributeRight** multiplier:XXX constant:XXX]];
    

    使两个属性相同:

    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.skipButton attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeRight multiplier:XXX constant:XXX]];
    

    attribute:NSLayoutAttributeXXXX 的两种情况必须相同。

    【讨论】:

      【解决方案2】:

      嘿,我不认为 _NSLayoutConstraintNumberExceedsLimit() 会导致崩溃。这只是一个警告。但是,理想情况下应该修复它。

      现在专注于崩溃。 问题在于:

      [NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: 不能在前导/尾随属性和 右/左属性。两者都使用前导/尾随,或都不使用。'

      也许在您的约束中的某个地方,您已将项目的 NSLayoutAttributeLeading 关联到 NSLayoutAttributeLeft。 你能把代码放在你添加约束的地方吗?

      【讨论】:

      • 这就是问题所在。我遇到的麻烦是在我的代码中找到我这样做的地方。很难追踪。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2018-05-08
      • 2012-06-30
      • 2019-03-19
      • 1970-01-01
      相关资源
      最近更新 更多