UITableViewController复制行?

时间:2014-01-24 02:03:00

标签: ios iphone uitableview

我有一个UITableViewController在向下滚动时复制行。我知道细胞正在重复使用,但我似乎无法弄清楚如何解决它。我已经阅读了其他类似的帖子,但在我的案例中无法找到解决方案。

在我的代码中我做错了什么导致重复的单元格?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"StringTableViewCell";

    if (indexPath.row == 0) {
        cellIdentifier = @"StringTableViewCell";
    } else if (indexPath.row == 1) {
        cellIdentifier = @"StringTableViewFooter";
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    // Sets up the table view cell accordingly based around whether it is the
    // string row or the footer
    if (cell) {
        if ([cell isKindOfClass:[StringTableViewCell class]]) {
            StringTableViewCell *stringCell = (StringTableViewCell *)cell;
            // Sets the photos to the array of photo data for the collection view
            [stringCell setCollectionData:self.images];
        } else if ([cell isKindOfClass:[StringFooterTableViewCell class]]) {
            // Sets the table view cell to be the custom footer view
            StringFooterTableViewCell *footerCell = [[StringFooterTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"StringTableViewCellFooter"];

            // Init's the footer with live data from here
            [footerCell setStringUploaderName:@"Name"];
            [footerCell setStringUploadDate:@"10 minutes ago"];
            [footerCell setStringUploaderProfileImage:[UIImage imageNamed:@"avatar.jpg"]];
            [footerCell setCommentButtonTitle:@"4.7k"];
            [footerCell setLikeButtonTitle:@"11.3k"];

            return footerCell;
        }
    }

    return cell;
}

2 个答案:

答案 0 :(得分:0)

UITableViewCell有一个prepareForReuse方法,每次要重用它时都会调用它。您可以将StringTableViewCell的imageview图像设置为nil,或者您可以在indexPath本身的单元格上执行此操作,因为仅鼓励prepareForReuse方法用于重置单元格的状态(如hightlighted或selected)以及它的子视图

答案 1 :(得分:0)

由于你有两个不同的单元格,你需要这样的东西:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        static NSString *cellIdentifier = @"StringTableViewCell";
        StringTableViewCell *stringCell = (StringTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (!stringCell) {
            stringCell = [[StringTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        [stringCell setCollectionData:self.images];

        return stringCell;
    } else if (indexPath.row == 1) {
        static NSString *cellIdentifier = @"StringTableViewFooter";
        StringFooterTableViewCell *footerCell = (StringFooterTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (!footerCell) {
            footerCell = [[StringFooterTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

        // Init's the footer with live data from here
        [footerCell setStringUploaderName:@"Name"];
        [footerCell setStringUploadDate:@"10 minutes ago"];
        [footerCell setStringUploaderProfileImage:[UIImage imageNamed:@"avatar.jpg"]];
        [footerCell setCommentButtonTitle:@"4.7k"];
        [footerCell setLikeButtonTitle:@"11.3k"];

        return footerCell;
    } else {
        return nil; // this shouldn't happen but makes the compiler happy
    }
}

当然,需要更新代码以显示适合给定部分的数据。