我的UITable正在重复使用它不应该的细胞!

时间:2010-12-07 21:27:15

标签: iphone uitableview

我有一个UITableViewController,它有两个部分。第一部分显示了一个带有居中文本的单个单元格,表示Add a new Slide。第二部分显示当前幻灯片。

当用户点击Add a new slide单元格时,新的UITableVeiwController会被推送到显示编辑器的堆栈上。如果用户保存新幻灯片(通过点击保存),则单元格将添加到数据源中,编辑器将从堆栈中弹出。

我有两个问题:

  1. 当弹出编辑器时,如果在点击Add a new slide之前删除了一个单元格,则旧单元格显示而不是新单元格。弹出UITableViewController(通过点击自动生成的后退按钮)修复了这个问题,但我想这根本不会发生。 (原来,在弹出编辑器后弹出表格没有更新,所以我将[self.tableView reloadData];添加到viewDidAppear方法。)

  2. 在一定数量的幻灯片后,列表中的最后一张幻灯片成为Add a new slide单元格。我知道数据输入正确,因为使用相同数据源的应用程序的另一部分正确更新。该表支持在第二部分进行编辑,当您交换单元格的顺序时,它在幕后正常运行,但错误的单元格仍在那里。

  3. 可能会发生什么?

    以下是我的一些代码:

    请注意,由于我正准备发布我的代码,因此我注意到大括号不匹配。对 cell==nil 的检查似乎包含了确定单元格内容的代码的第二部分。这会修复表格第二部分中单元格的标签,但样式仍然是错误的。我已经修改了代码,但原文发布在这里。

    // Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        static NSString *CellIdentifier = @"Cell";
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            if ([indexPath section] == 0 ) {
                cell = [[[MBTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            }else if([indexPath section] == 1){
                cell = [[[MBTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    
        }
    
        if ([indexPath section] == 0) {
            [cell.textLabel setTextAlignment:UITextAlignmentCenter];
            [cell.textLabel setText:@"Add a New Slide"];
        }else if([indexPath section] == 1){
            NSArray *storedViewsInfo = [[NSArray alloc] initWithArray:[kSettings arrayForKey:@"views"]];
    
            if ([[[storedViewsInfo objectAtIndex:[indexPath row]] valueForKey:@"type"] isEqualToString:@"announcement"]) {
                [cell.detailTextLabel setText:@"Custom Announcement"];
                [cell.textLabel setText:[[[storedViewsInfo objectAtIndex:[indexPath row]] valueForKey:@"info"] valueForKey:@"text"]];
            }
    
            [storedViewsInfo release];
            [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    
        }
        }
        return cell;
    
    }
    

1 个答案:

答案 0 :(得分:3)

在没有看到代码的情况下,首先想到的是检查您是否在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;方法中为自定义单元格指定了不同的标识符?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier1 = @"CellIdentifier1";
    static NSString *Cellidentifier2 = @"CellIdentifier2";

    if (indexPath.section == kAddSlideSection) {
        CustomCell *cellType1 = (CustomCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
        ...
    } else {
        CustomCell *cellType2 = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
        ...
    }
}

同样可能值得考虑实施一种在用户完成添加新幻灯片时调用的委托方法 - 即如果从该方法成功调用[self.tableview reloadData]而不是viewWillAppear