使用XCode 4.5和iOS 6,我正在开发一个带有自定义单元格的简单表视图的应用程序。在iOS 5和更低版本中,我已经做过一百次了,但是由于某种原因,新的autoLayout系统给我带来了很多麻烦。
我在IB中设置了表视图和原型单元格,添加了子视图,并将它们连接为IBOutlets,然后设置我的委托和dataSource。但是,无论何时从cellForRowAtIndexPath获取第一个单元格,我都会得到以下错误:
* /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776中的-ShopCell layoutSublayersOfLayer:,断言失败 *终止应用程序的原因是:“在执行-layoutSubviews之后仍然需要自动布局。ShopCell的-layoutSubviews实现需要调用Super.”,原因是“NSInternalInconsistencyException”异常。
我还没有在子类单元格( -layoutSubviews )中实现一个ShopCell方法,即使我尝试这样做并添加超级调用(这意味着我仍然会得到相同的错误)。如果我从IB中的单元格中移除子视图,并将其更改为标准的UITableViewCell,那么一切都按预期的方式工作,当然,我的单元格中没有数据。
我几乎可以肯定,我遗漏了一些简单的东西,但找不到任何文档或指南来说明我做错了什么。任何帮助都将不胜感激。
编辑:只是尝试将其更改为IB中的一个UITableViewCell,并将所有子视图保留在原地,仍然是相同的错误。
发布于 2012-09-27 22:42:33
在手动添加代码中的约束时,我遇到了同样的问题。在代码中,我执行了以下操作:
{
[self setTranslatesAutoresizingMaskIntoConstraints:YES];
[self addSubview:someView];
[self addSubview:someOtherView];
[self addConstraint:...];
}假说
据我所知,问题是当您禁用translatesAutoresizingMaskIntoConstraints时,UITableViewCell开始使用自动布局,并自然失败,因为layoutSublayersForLayer的底层实现没有调用超级。有Hopper或其他工具的人可以证实这一点。既然你在使用IB,你可能想知道为什么这是个问题.这是因为使用IB会自动禁用对其添加约束的视图的translatesAutoresizingMaskIntoConstraints (它将自动添加一个宽度和高度约束)。
溶液
我的解决方案是把所有东西都转移到contentView。
{
[self.contentView addSubview:someView];
[self.contentView addSubview:someOtherView];
[self.contentView addConstraint:...];
}我不能100%确定这在Interface中是否有效,但是如果您将所有东西从单元格中推开(假设您有直接在其上的东西),那么它应该可以工作。希望这对你有帮助!
发布于 2012-10-17 18:51:59
显然,UITableViewCell的layoutSubviews实现没有调用super,这是自动布局的一个问题。我想看看是否把下面的类别放到项目中去解决问题。它帮助了一个测试项目。
#import <objc/runtime.h>
#import <objc/message.h>
@implementation UITableViewCell (FixUITableViewCellAutolayoutIHope)
+ (void)load
{
Method existing = class_getInstanceMethod(self, @selector(layoutSubviews));
Method new = class_getInstanceMethod(self, @selector(_autolayout_replacementLayoutSubviews));
method_exchangeImplementations(existing, new);
}
- (void)_autolayout_replacementLayoutSubviews
{
[super layoutSubviews];
[self _autolayout_replacementLayoutSubviews]; // not recursive due to method swizzling
[super layoutSubviews];
}
@end我可能会添加在表单元格上使用backgroundView时出现的问题,因为它会作为子视图添加到单元格中(而大多数子视图应该添加到表单元格的contentView中,这通常会更好地工作)。
注意:这个bug似乎是在iOS7中修复的;我删除了这段代码,或者至少添加了一个运行时检查,这样只有在iOS6上运行时才能完成。
发布于 2013-02-28 15:45:05
几个月来我都有同样的毛病。但我发现了问题所在。
创建IB文件时,已经添加了一个UIView。如果使用此视图,当禁用自动布局时,应用程序不会崩溃(但还有其他问题)。使用自动布局时,必须在Object::UITableViewCell中选择右视图。
实际上,您应该始终使用,因为所有子视图都被添加到UITableViewCell的contentView中。
就这样。一切都会好的。
https://stackoverflow.com/questions/12610783
复制相似问题