UITableView问题显示多个部分的内容

时间:2011-05-23 16:28:29

标签: iphone objective-c cocoa-touch uitableview

我有一个表格视图,显示了几个可能部分的内容。我遇到的问题是当一个部分没有出现在屏幕的顶部并且用户必须滚动到它时,由于某种原因,第一部分的内容显示在单元格标签中。选择项目时,它会加载正确的数据,但在表格视图中无法正确显示。这是单元格代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    Sections *thisSection = [self.sectionsArray objectAtIndex:indexPath.section];

    NSArray *sectionMedia = [NSArray arrayWithArray:[thisSection.media allObjects]];

    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"releaseDate" ascending:NO];
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"sortKey" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
    sectionMedia = [sectionMedia sortedArrayUsingDescriptors:sortDescriptors];

    Media *thisMedia = [sectionMedia objectAtIndex:indexPath.row];

    [NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MMM d, yyyy"];
    NSString *articleDisplayDate = [dateFormatter stringFromDate:thisMedia.releaseDate];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.text = thisMedia.title;
        cell.detailTextLabel.text = articleDisplayDate;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    [dateFormatter release];
    [sortDescriptors release];
    [sortDescriptor1 release];
    [sortDescriptor2 release];

    return cell;
}

当我在if块“if(cell == nil)”之外打印日志时,它似乎始终显示正确的数据。但是,当我将日志放在这个块中时,它不会从视图外部记录数据,当我向下滚动到数据时它什么都不做 - 所以看起来它没有看到那个单元格数据为nil并且分配它来自第一部分的数据。

1 个答案:

答案 0 :(得分:1)

我在此代码中看到的一个问题是,您只在创建新单元格时设置单元格内容,即在if (cell == nil)内部,而不是在通过dequeueReusableCellWithIdentifier重用已存在的单元格时。因此,在这种情况下,您将获得一个包含旧内容的单元格,并且您没有设置“正确”的内容。我建议将一些陈述移出if块:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
cell.textLabel.text = thisMedia.title;
cell.detailTextLabel.text = articleDisplayDate;