添加人员后,Tableview无法正确更新

时间:2012-03-19 23:09:58

标签: iphone tableview

我必须在这里找到一些简单的东西,但它逃脱了我。在用户将新人输入可变数组后,我想更新表。可变数组是数据源。我相信我的问题在于cellForRowAtIndexPath

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

    TextFieldCell *customCell = (TextFieldCell *)[tableView dequeueReusableCellWithIdentifier:@"TextCellID"];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (indexPath.row == 0) {
        if (customCell == nil) {
            NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"TextFieldCell" owner:nil    options:nil];
            for (id currentObject in nibObjects) {
                if ([currentObject isKindOfClass:[TextFieldCell class]])
                    customCell = (TextFieldCell *)currentObject;
            }
        }
        customCell.nameTextField.delegate = self;
        cell = customCell;
    }

    else {
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

            cell.textLabel.text = [[self.peopleArray objectAtIndex:indexPath.row-1] name];
            NSLog(@"PERSON AT ROW %d = %@", indexPath.row-1, [[self.peopleArray objectAtIndex:indexPath.row-1] name]);
            NSLog(@"peopleArray's Size = %d", [self.peopleArray count]);
        }
    }

    return cell; 
}

当我第一次加载视图时,一切都很棒。这就是打印:

PERSON AT ROW 0 = Melissa
peopleArray's Size = 2
PERSON AT ROW 1 = Dave
peopleArray's Size = 2

在我将某人添加到该数组后,我得到了这个:

PERSON AT ROW 1 = Dave
peopleArray's Size = 3
PERSON AT ROW 2 = Tom
peopleArray's Size = 3

当我添加第二个人时,我得到了:

PERSON AT ROW 2 = Tom
peopleArray's Size = 4
PERSON AT ROW 3 = Ralph
peopleArray's Size = 4

为什么不打印阵列中的所有人?这种模式仍在继续,它只打印两个人,而且总是最后两个人。我错过了什么?

--- 已更新 ---

确定。我的细胞没有正确更新,我想我的建议是为了帮助我。我想这不是主要问题。

我的问题是我的行没有打印正确的信息。当视图第一次加载时,我得到:

Melissa
Dave

但在我添加Tom之后,我得到了:

Melissa         Dave
Melissa    or   Dave
Tom             Tom

在我添加拉尔夫后,我得到:

Melissa          ?
Tom        or    ?
Tom              Tom
Ralph            Ralph

发生了什么事?

2 个答案:

答案 0 :(得分:1)

问题是您没有更新重复使用的单元格的标签。在新创建单元格时,您只需设置一次。所以将代码更改为:

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.textLabel.text = [[self.peopleArray objectAtIndex:indexPath.row-1] name];
NSLog(@"PERSON AT ROW %d = %@", indexPath.row-1, [[self.peopleArray objectAtIndex:indexPath.row-1] name]);
NSLog(@"peopleArray's Size = %d", [self.peopleArray count]);

答案 1 :(得分:1)

你在cellForRowAtIndexPath中调用NSLog就是这个原因。 它是第一次记录所有内容,因为单元格是新的,但在此之后,单元格将保持缓存状态,直到它们离开屏幕。由于您的表很小,所以第一个单元格始终在屏幕上,从不重新创建。如果你想监控数据源而不是单元格,请尝试将NSLog移动到其他地方(如果加载大表,滚动它并观察控制台,你可以看到我的意思)