执行 -layoutSubviews 后仍需要自动布局,使用UITableViewCell子类。

115
我正在使用XCode 4.5和iOS 6开发一个带有自定义单元格的简单表视图的应用程序。在iOS 5及以下版本中已经完成了一百次以上,但由于新的自动布局系统,在这里遇到了很多麻烦。
我在IB中设置了表视图和原型单元格,添加了子视图并将它们连接为IBOutlets,然后设置代理和数据源。然而,现在每当从cellForRowAtIndexPath获取第一个单元格时,我会收到以下错误:
Assertion failure in -[ShopCell layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. ShopCell's implementation of -layoutSubviews needs to call super.'
我没有在我的子类化单元格(ShopCell)中实现-layoutSubviews方法,即使我尝试这样做并添加super调用,仍然会收到相同的错误。如果我在IB中删除单元格中的子视图,并将其更改为标准UITableViewCell,则一切正常,尽管当然我留下了没有数据的单元格。
我几乎可以确定有些简单的东西我错过了,但找不到任何文档或指南来提示我做错了什么。感谢任何帮助。

如果使用自动布局,请在调试器区域尝试lldb [[UIWindow keyWindow] _autoLayoutTrace]。 - A-Live
3
你是不是在使用UIView代替UITableViewCell作为自定义单元格?我之前也遇到了同样的问题。我一开始使用UIView作为自定义单元格,并向其中添加子视图。后来改用UITableViewCell就解决了问题。 - user1705389
取消检查检视器中的autoLayout框,然后清理并运行。它一定会起作用。 - Nico
我曾经遇到过同样的问题,为此苦苦挣扎了一段时间。user1705389的解决方案帮助了我。对我来说,这个问题出现在一个原本是单元格的表视图页脚上,我忘记将单元格的超类从UITableViewCell更改为简单的UIView。 - ShayDavidson
我在iOS 7.1中遇到了这个错误,但在iOS 8中没有。 - onmyway133
显示剩余2条评论
31个回答

0

我曾经遇到过同样的问题。我进入了我的DetailViewController并将标识符重命名为UIView。它之前是UITableView。这解决了问题。这个问题不一定在你的DetailViewController中。它可能在任何其他一个视图控制器中。尝试将其重命名为相应的标识符。


0

我也遇到了同样的问题。事实证明,如果你从ShopCell .xib/storyboard中以编程方式添加一个使用自动布局的子视图作为另一个视图的子视图,那么可能会抛出异常,这取决于你的约束如何配置。我猜测,在IB中创建的约束是在以编程方式将视图添加为子视图时创建麻烦的原因,因为它会同时维护从viewA --> viewB的约束,而与此同时,你可能会将viewB作为子视图添加到viewC中。你懂的(这句话甚至让我自己都感到困惑)?

在我的情况下 - 由于引起问题的是非常简单的视图 - 我以编程方式创建了这些视图,而不是在IB中创建。这解决了问题。你可以将这些视图提取到其他xib文件中,并为其禁用自动布局。我想那应该可以解决问题。


0

我在Xcode 6,iOS 7+中设置表格页脚视图时遇到了非常类似的问题。

解决方案在nib文件的格式上。显然,它被卡在Xcode 4格式或其他什么地方。

将文件设置更改为“打开方式:Xcode 6.0”(或默认值),即可立即解决问题。

偶然发现了解决方案:这让我疯狂,所以我删除了整个文件并重新创建了一个,显然是使用默认设置。我不知道为什么最新的Xcode编辑文件没有将其转换为Xcode 5+格式,因为通常会发生这种情况。

f


0

我曾经遇到过完全相同的问题。以下是我的项目问题所在:
当我在Interface Builder上创建自定义UITableViewCell时,我从Xcode的对象集合面板中拖动了一个View而不是Table View Cell作为自定义表格单元格。
如果你也遇到了同样的情况,这里是解决方案:
在界面构建器中删除视图,确保从对象集合面板中拖动Table View Cell并重新制作自定义表格单元格视图。您可以将旧视图中的对象复制并粘贴到新的Table View Cell画布中。


0

我已经找到了解决方案。

在我的情况下,我在Storyboard中创建了单元格视图(启用了自动布局),并在ViewController.m中定义了自定义的UITableViewCell接口,我必须将接口移动到ViewController.h中。


0

我遇到了同样的问题,最终发现原因是我将一个约束添加到了UITableViewCell上,而应该添加到UITableViewCell的contentView上。当我更改约束后,一切都正常了!


0

这个问题可能是由于在viewDidAppear中忘记调用[super viewDidAppear:]引起的,但我相信这不是唯一的原因。


0

当我使用Storyboard创建自定义UITableViewCell时,遇到了同样的问题。幸运的是,我找到了问题所在,因为我将添加到单元格中的UIButton与accessoryView([UITableViewCell setAccessoryView:])关联起来。

所以这个问题发生在我的项目上,当在iOS6上运行时。

解决方案

我释放了accessoryView和包含自定义单元格的按钮之间的关联。

建议

您不应该使用UITableViewCell的原生元素并对其进行更改。


0
我曾经遇到过在IB中使用静态表格视图单元格的类似问题。其中一个单元格有一个子视图,其类被错误地更改为UITextfield的子类。编译器没有给出任何警告/错误。但在运行时,系统无法加载具有上述崩溃的视图控制器。

0
问题在于对子视图的布局调用的顺序:

查看

iOS < 8中出现


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接