iPhone SDK:使用新行插入和更新UITableView

时间:2009-03-26 15:05:27

标签: iphone uitableview sdk

我有一个tableView,需要在从另一个视图插入信息后更新。如果我执行

[self.tableView reloadData];

下次我在另一个视图中插入更多信息并尝试重新加载表时,所有当前可见的行都会重复。

换句话说,当我启动应用程序时,我有:

tableView:
    Row 1
    Row 2

然后我提交了一些信息,这些信息也将显示在表格中,突然我有:

tableView
    Row 1
    Row 2
    Row 3 <- info I just added
    Row 1
    Row 2

我的numberOfRowsInSection实现如下所示:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [ItemsController sharedItemsController].count;
}

我的cellForRowAtIndexPath实现如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ItemsController* controller = [ItemsController sharedItemsController];
    NSMutableArray* recentItems = controller.listOfRecentItems;

    CustomCell *cell = nil;
    NSUInteger row = [indexPath row];

    if( row < recentItems.count )
    {
        Items*  item = [recentItems objectAtIndex:row];
        if( recentCellData == nil )
            recentCellData = [[NSMutableDictionary alloc] initWithCapacity:[indexPath length]];

        if( [recentCellData count] > 0 )
            cell = [recentCellData objectForKey:[NSString stringWithFormat:@"%d", row]];
        if (cell == nil) {
            UIViewController * view1 = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];

            cell = (CustomCell*)[view1 view];

            [recentCellData setObject:cell forKey:[NSString stringWithFormat:@"%d",row]];
        }

       // do some other stuff here
    }
    // Set up the cell
    return cell;
}

更新表格的最佳方法是什么,避免重复当前可见的行。 提前感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

错误不在于您如何重新加载表格,而在于您如何向其提供数据。在数据源方法和添加新行的方法中设置断点,以查看出错的位置。

答案 1 :(得分:2)

如果tableView:numberOfRowsinSection:返回5,您最终只能获得五件商品。这是你问题的简单答案,但我在这里看到其他问题。我想知道为什么你有这个测试:row < recentItems.count。该数组是否与[ItemsController sharedItemsController].count相同?你真的需要为这两种方法使用相同的数组。

(此外,它不是语法错误,但您不应该将属性语法用于未声明为属性的内容。您应该改为编写[recentItems count]。)

我也对用于设置单元格的代码感到困惑。细胞意味着可重复使用。也就是说,您创建一个单元格,然后每次在tableView:cellForRowAtIndexPath:的实现中重新配置它。您的代码会为列表中的每个项目创建一个单元格。这是非常低效的内存,如果你在内存中保留了大量的单元格,那么由于iPhone上的内存不足,可能会导致程序崩溃。

推荐的方法是致电dequeueReusableCellWithIdentifier:。如果返回nil,则使用initWithFrame:reuseIdentifier:初始化程序设置单元格。表格视图非常智能,只会在您需要时重新绘制单元格。

你的recentCellData字典对我来说也很不稳定。如果您使用键@"2"在项目后插入项目,该怎么办?所有键@"3"以后的项目都需要向右移动一个元素才能按预期方式工作。这是一大笔簿记,对我来说似乎没那么重要。如果你真的需要这样的东西 - 并且要清楚,我认为你不这样做 - 你为什么不使用更容易使用的NSMutableArray

答案 2 :(得分:1)

我在上面添加了更多信息。