我有一个带有3个标签和一个按钮的自定义单元格。一切都运行良好,直到我没有为我的表视图实现tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
方法。 (我需要它,因为我在这里根据标签的长度设置单元格高度。)问题是当我点击likeButton
时likeCountLabel.text
将显示来自IB的标签样本值一秒钟然后在每个单元格中再次显示前一个(正确的)字符串,而不仅仅是在抽头中。当我删除heightForRowAtIndexPath:
时,它再次完美。正如我发现它重新加载表视图后发生的那样,但是没有任何想法,因为当我不调整高度时这些标签可以正常工作。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
static NSString *CellIdentifier = @"cell";
NewsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
PFQuery *query = [like query];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (objects) {
NSString *likeNumber = [NSString stringWithFormat:@"%d", objects.count];
cell.likeCountLabel.text = likeNumber;
}
}];
cell.likeButton.tag = indexPath.row;
[cell.likeButton addTarget:self action:@selector(didTapLikeButton:) forControlEvents:UIControlEventTouchUpInside];
cell.usrName.text = object[@"usrName"];
cell.usrDescription.text = object[@"desc"];
cell.date.text = object[@"date"];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"cell";
NewsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
PFObject *object = [self.objects objectAtIndex:indexPath.row];
cell.usrName.text = object[@"usrName"];
cell.usrDescription.text = object[@"desc"];
cell.date.text = object[@"date"];
//get the height the cell
// [cell layoutIfNeeded];
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
//paddign of 1 Point
return height + 12;
}
- (void)didTapLikeButton:(id)sender {
// Cast Sender to UIButton
UIButton *button = (UIButton *)sender;
PFObject *likeRow = [self.objects objectAtIndex:button.tag];
[SaveHelper likeObject:likeRow withUploader:[PFUser currentUser]];
[self.tableView reloadData];
}
答案 0 :(得分:1)
你不应该在heightForRowAtIndexPath:
中出列或实例化单元格 - 这会破坏模式(即tableView
在某些indexPath
询问所需的单元格高度,而另一方面要求它为同一个indexPath
实例化一个单元格,这样你就可以回答所需的高度......)
在cellForRowAtIndexPath:
中,根据数据模型生成(或重复使用)并填充数据。如果单元格高度取决于数据 - 也应该从数据模型计算此高度。
为了避免在heightForRowAtIndexPath:
中实例化单元格,您可以像+ (CGFloat) heightOfCellWithContent...
一样编写class method并使用此方法计算heightForRowAtIndexPath:
内特定类型单元格的所需高度。
换句话说:您需要NewsTableViewCell
类才能告诉您实例(该类型的单元格)需要的高度内容...
编辑:
您显然有一个名为UITableViewCell
的{{1}}子类,此类的实例希望填充NewsTableViewCell
,usrName
等数据...
向usrDescription
添加一个类方法:
NewsTableViewCell
甚至更好的情况:
+ (CGFloat)cellHeightNeededForUsrName:(NSString *)usrName
usrDescription:(NSString *)usrDescription {
// calculate the height here
}
然后以这种方式修改+ (CGFloat)cellHeightNeededForData:(PFObject *)data {
// calculate the height here
}
:
- (CGFloat)tableView:heightForRowAtIndexPath: