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

Posted

技术标签:

【中文标题】iPhone SDK:使用新行插入和更新 UITableView【英文标题】:iPhone SDK: Inserting and updating a UITableView with a new row 【发布时间】:2009-03-26 15:05:26 【问题描述】:

我有一个 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;

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

【问题讨论】:

似乎您需要在问题中包含 tableView:numberOfRowsInSection: 方法的实现。 我将该信息添加到问题中。谢谢! 【参考方案1】:

错误不在于您重新加载表格的方式,而在于您向其提供数据的方式。在数据源方法和添加新行的方法中设置断点,看看哪里出错了。

【讨论】:

【参考方案2】:

如果tableView:numberOfRowsinSection: 返回5,您只会得到五个项目。这就是您问题的简单答案,但我在这里看到了其他问题。我想知道您为什么要进行此测试:row &lt; recentItems.count。该数组是否与[ItemsController sharedItemsController].count 相同?您确实需要为这两种方法使用相同的数组。

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

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

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

你的recentCellData 字典在我看来也很不稳定。如果您在带有键@"2" 的项目之后插入一个项目怎么办?所有带有@"3" 键的项目都需要向右移动一个元素才能按您期望的方式工作。这是大量的簿记,对我来说似乎相当不必要。如果您真的需要这样的东西 - 并且明确地说,我认为您不需要 - 为什么不使用更容易使用的NSMutableArray

【讨论】:

我正在使用 NSMutableArray。这一切都与视图的显示方式有关。如果我退出应用程序并重新启动,一切都会按原样显示。 我指的是recentCellData。那是一本字典。【参考方案3】:

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

【讨论】:

以上是关于iPhone SDK:使用新行插入和更新 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

更新一行,如果缺少则插入新行

SqlDataAdapter.Update(dataset) 方法插入新行但不更新现有行

SQL 查询表中的更新行并将其插入为新行

Oracle:更新旧行时创建新行

oracle触发器在表中插入新行时更新新的视图行

插入新行表1复制到表2选定字段后mysql触发器没有重复