UITableview heightForRowAtIndexPath:在单元格中重新加载标签

时间:2015-03-08 23:14:16

标签: ios objective-c uitableview

我有一个带有3个标签和一个按钮的自定义单元格。一切都运行良好,直到我没有为我的表视图实现tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath方法。 (我需要它,因为我在这里根据标签的长度设置单元格高度。)问题是当我点击likeButtonlikeCountLabel.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];


}

1 个答案:

答案 0 :(得分:1)

你不应该在heightForRowAtIndexPath:中出列或实例化单元格 - 这会破坏模式(即tableView在某些indexPath询问所需的单元格高度,而另一方面要求它为同一个indexPath实例化一个单元格,这样你就可以回答所需的高度......)

cellForRowAtIndexPath:中,根据数据模型生成(或重复使用)并填充数据。如果单元格高度取决于数据 - 也应该从数据模型计算此高度。

为了避免在heightForRowAtIndexPath:中实例化单元格,您可以像+ (CGFloat) heightOfCellWithContent...一样编写class method并使用此方法计算heightForRowAtIndexPath:内特定类型单元格的所需高度。

换句话说:您需要NewsTableViewCell 才能告诉您实例(该类型的单元格)需要的高度内容...

编辑:

您显然有一个名为UITableViewCell的{​​{1}}子类,此类的实例希望填充NewsTableViewCellusrName等数据...

usrDescription添加一个类方法:

NewsTableViewCell

甚至更好的情况:

+ (CGFloat)cellHeightNeededForUsrName:(NSString *)usrName
                       usrDescription:(NSString *)usrDescription {
  // calculate the height here
}

然后以这种方式修改+ (CGFloat)cellHeightNeededForData:(PFObject *)data { // calculate the height here }

- (CGFloat)tableView:heightForRowAtIndexPath: