iOS:addConstraints:崩溃的应用程序

Posted

技术标签:

【中文标题】iOS:addConstraints:崩溃的应用程序【英文标题】:iOS: addConstraints: crashing app 【发布时间】:2012-12-11 12:26:21 【问题描述】:

问题

我似乎无法在我现有的项目中采用自动布局。

详情

我之前遇到过与这个问题 presentViewController: crash on ios <6 (AutoLayout) 相同的问题,但提供的答案都不是我的解决方案:我正在使用所有没有 xib 的情节提要视图。我的“使用自动布局”设置已关闭,我只使用 iOS 6。

我的视图控制器最初崩溃了,所以我设置了要延迟添加的约束,现在我的应用程序在任何addConstraints: 调用期间崩溃。最糟糕的是,它不会告诉我为什么。

代码

我将链接我的代码,但它非常简单。

-(void)addAllConstraints

    NSDictionary * views = NSDictionaryOfVariableBindings(_memoryImage, _peopleView, _contentHolder, _commentsTableView);
    NSArray * constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[_memoryImage]-50-[_peopleView]-0-[_contentHolder]-0-[_commentsTableView]" options:0 metrics:nil views:views];
    NSLog(@"Views %@, Constraints %@", views, constraints);
    [_peopleView addConstraints:constraints];
    [_memoryImage addConstraints:constraints];
    [_contentHolder addConstraints:constraints];
   [_commentsTableView addConstraints:constraints];

应用程序在 _peopleView 调用 addConstraints 时崩溃。视图和 NSLayoutConstraints 均已成功创建。

有什么想法吗?谢谢你,节日快乐。

编辑:

添加崩溃日志以显示没有显示任何有用的信息:

2012-12-25 10:40:13.936 -----[4955:907] Views 
"_commentsTableView" = "<UITableView: 0x1eb6be00; frame = (0 372; 320 100); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x1e51ce00>; layer = <CALayer: 0x1e51cee0>; contentOffset: 0, 0>";
"_contentHolder" = "<UIView: 0x1e5c6590; frame = (0 270; 320 112); layer = <CALayer: 0x1e5c27f0>>";
"_memoryImage" = "<UIButton: 0x1e5c4aa0; frame = (0 0; 320 280); opaque = NO; layer = <CALayer: 0x1e5c4b60>>";
"_peopleView" = "<UIView: 0x1f0ceea0; frame = (0 230; 320 50); layer = <CALayer: 0x1f0cf790>>";

Constraints (
"NSLayoutConstraint:0x1e51a880 V:[UIButton:0x1e5c4aa0]-(50)-[UIView:0x1f0ceea0]",
"NSLayoutConstraint:0x1e5ba4e0 V:[UIView:0x1f0ceea0]-(0)-[UIView:0x1e5c6590]",
"NSLayoutConstraint:0x1e51b860 V:[UIView:0x1e5c6590]-(0)-[UITableView:0x1eb6be00]"
)


  
   (lldb) 

【问题讨论】:

它肯定会在崩溃日志中为您提供一些信息。对于初学者,您的间距常量应该放在括号中。 developer.apple.com/library/mac/#documentation/UserExperience/… 不正确。不,崩溃日志中根本没有任何内容。 @RobCaraway 至少应该有什么样的崩溃发生了。是SIGABRT吗? EXC_BAD_ACCESS?还是什么? 括号我错了,抱歉。我认为 rdelmar 有你的答案,但在调试约束时要获得更多信息,你可能会发现添加一个所有异常断点很有用。 rdelmar 确实是正确的。不过,为了澄清未来的观察者,这确实是SIGABRT,并且在我寻找解决方案时打开了异常断点。 【参考方案1】:

约束应该被添加到作为子视图的父视图的视图中。因此,如果这些对象在您的主视图中,那么您应该有(并且没有其他 addConstraints: 行):

[self.view addConstraints:constraints];

此外,您的字典视图应该以 nil 终止(我不知道这是否有必要。我在 Apple 示例中注意到他们没有这样做,但函数定义显示为零)。

【讨论】:

您不需要为绑定字典宏执行 nil 终止。

以上是关于iOS:addConstraints:崩溃的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Fabric Answer 在从 Xcode 10 和 iOS 12 开始时崩溃 iOS 应用程序

iOS:如何在没有 someView.addConstraints 的情况下使用 constraintsWithVisualFormat?

临时和企业签名的应用程序在 iOS 13.3.1 的启动屏幕上崩溃

iOS 约束样式:addConstraints vs .isActive = true

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )

Kotlin 协程协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )