滚动时UITableViewCell的奇怪行为,UIButtons消失

时间:2015-02-11 10:54:08

标签: ios objective-c xcode uitableview uikit

我正在尝试在自定义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;
}

2 个答案:

答案 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方法。这是您应该重置可以由缓存系统重用的单元格上的各种属性。

Apple Docs

<强> -prepareForReuse

准备可重用的单元格以供表格视图的委托重用。

<强>讨论

如果UITableViewCell对象是可重用的 - 也就是说,它具有重用标识符 - 在从UITableView方法dequeueReusableCellWithIdentifier:返回对象之前调用此方法:出于性能原因,您应该仅重置与内容无关的单元格属性,例如,alpha,编辑和选择状态。 tableView:cellForRowAtIndexPath:中的表视图委托应始终在重用单元格时重置所有内容。如果单元对象没有关联的重用标识符,则不会调用此方法。如果重写此方法,则必须确保调用超类实现。