我正在尝试使用autolayout在代码中创建UITableViewCell。但我一直收到这个错误:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. DXCell's implementation of -layoutSubviews needs to call super.
这是我目前的代码:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
_image = [UIImageView new];
_image.translatesAutoresizingMaskIntoConstraints = NO;
_image.image = [UIImage imageNamed:@"image"];
[self addSubview:self.clubImage];
self.shouldUpdate = YES;
[self setNeedsUpdateConstraints];
}
return self;
}
- (void) updateConstraints {
if (self.shouldUpdate) {
NSDictionary * views = @{@"club" : self.clubImage};
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-6-[club(48)]|" options:0 metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-6-[club(48)]-6-|" options:0 metrics:nil views:views]];
self.shouldUpdate = NO;
}
[super updateConstraints];
}
正如您所看到的,我没有覆盖layoutSubviews?所以我不明白这个错误。
单元格通过类注册,并在数据源方法中调用:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
}
答案:我是直接添加视图而不是使用contentView。这导致了问题,现在已修复
答案 0 :(得分:1)
DXCell -layoutSubviews的实现需要调用super。
因此,请检查DXCell.m(您的自定义单元格)下的方法layoutSubviews
,然后调用
[super layoutSubviews];
在覆盖的开头。
答案 1 :(得分:0)
尝试替换行[self setNeedsUpdateConstraints];以下
[self layoutIfNeeded];
[self updateConstraintsIfNeeded];