iOS在代码中创建TableViewCell

时间:2014-03-14 13:49:51

标签: ios objective-c uitableview

我正在尝试使用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。这导致了问题,现在已修复

2 个答案:

答案 0 :(得分:1)

  

DXCell -layoutSubviews的实现需要调用super。

因此,请检查DXCell.m(您的自定义单元格)下的方法layoutSubviews,然后调用

[super layoutSubviews];

在覆盖的开头。

答案 1 :(得分:0)

尝试替换行[self setNeedsUpdateConstraints];以下

[self layoutIfNeeded];
[self updateConstraintsIfNeeded];