我正在尝试在自定义UITableViewCell中设置一些UIButtons和UILabels。对于表格中的每一行,我有4个带有用户个人资料图像的按钮,每个按钮下面是一个显示用户名的标签。图像和用户名取自Parse.com。我有一个大小为34的朋友数组,我显示9行,所以最后两个按钮和标签必须隐藏。下面的代码可以工作,但出于某种原因,当我向上滚动表时,其他一些行也会隐藏它们最右边的两个按钮和标签。我想知道我从阵列加载图像的逻辑是不正确的。不确定这里发生了什么。任何建议都将不胜感激。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
FriendViewCell *cell = (FriendViewCell *)[tableView dequeueReusableCellWithIdentifier:@"friendCell" forIndexPath:indexPath];
for (int i = 0; i < 4; i++) {
if ((int)indexPath.row * 4 + i < [self.currentUser.friends count]) {
UIButton *button = cell.buttons[i];
[button setTag:(int)indexPath.row * 4 + i];
button.layer.cornerRadius = button.frame.size.width / 2;
button.clipsToBounds = YES;
UILabel *label = cell.labels[i];
[button addTarget:self action:@selector(friendTapped:) forControlEvents:UIControlEventTouchUpInside];
//here we need to decide what to access
PFUser *user = self.currentUser.friends[(int)indexPath.row * 4 + i];
label.text = user.username;
PFFile *userImageFile = user[@"profilePic"];
[userImageFile getDataInBackgroundWithBlock: ^(NSData *imageData, NSError *error) {
if (!error) {
UIImage *image = [UIImage imageWithData:imageData];
[button setBackgroundImage:image forState:UIControlStateNormal];
}
}];
}
else {
UIButton *button = cell.buttons[i];
[button setEnabled:NO];
[button setHidden:YES];
UILabel *label = cell.labels[i];
[label setHidden:YES];
}
}
return cell;
}
答案 0 :(得分:1)
您可以尝试在第一次传导时取消隐藏按钮和标签,如:
if ((int)indexPath.row * 4 + i < [self.currentUser.friends count]) {
[button setEnabled:YES];
[button setHidden:NO];
[label setHidden:NO];
// Other code
}
else{
......
}
答案 1 :(得分:0)
iOS&#39;处理这个问题的方法是填写自定义单元格的prepareForReuse方法。这是您应该重置可以由缓存系统重用的单元格上的各种属性。
<强> -prepareForReuse 强>
准备可重用的单元格以供表格视图的委托重用。
<强>讨论强>
如果UITableViewCell对象是可重用的 - 也就是说,它具有重用标识符 - 在从UITableView方法dequeueReusableCellWithIdentifier:返回对象之前调用此方法:出于性能原因,您应该仅重置与内容无关的单元格属性,例如,alpha,编辑和选择状态。 tableView:cellForRowAtIndexPath:中的表视图委托应始终在重用单元格时重置所有内容。如果单元对象没有关联的重用标识符,则不会调用此方法。如果重写此方法,则必须确保调用超类实现。