gpt4 book ai didi

ios - UITableview heightForRowAtIndexPath : reloads label in cell

转载 作者:行者123 更新时间:2023-11-29 12:26:34 27 4
gpt4 key购买 nike

我有一个带有 3 个标签和一个按钮的自定义单元格。一切正常,直到我没有为我的 TableView 实现 tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 方法。 (我需要它,因为我在这里根据标签的长度设置单元格高度。)问题是当我点击 likeButton 时,likeCountLabel.text 将显示标签示例IB 中的值持续一秒钟,然后在每个单元格中再次显示前一个(正确的)字符串,而不仅仅是在被点击的单元格中。当我删除 heightForRowAtIndexPath: 时,它又完美了。正如我发现的那样,它发生在我重新加载表格 View 之后,但我不知道,因为当我不调整高度时,这些标签可以完美地工作。

- (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];


}

最佳答案

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

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

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

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

编辑:

您显然有一个名为 NewsTableViewCellUITableViewCell 子类,并且此类的实例期望填充诸如 usrNameusrDescription 之类的数据...

NewsTableViewCell 添加一个类方法:

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

或者在你的情况下更好:

+ (CGFloat)cellHeightNeededForData:(PFObject *)data {
// calculate the height here
}

然后以这种方式修改您的 - (CGFloat)tableView:heightForRowAtIndexPath::

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

PFObject *object = [self.objects objectAtIndex:indexPath.row];

return [NewsTableViewCell cellHeightNeededForData:object];
}

关于ios - UITableview heightForRowAtIndexPath : reloads label in cell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28933030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com