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 < recentItems.count
。该数组是否与[ItemsController sharedItemsController].count
相同?您确实需要为这两种方法使用相同的数组。
(另外,这不是语法错误,但您不应该将属性语法用于未声明为属性的内容。您应该改写[recentItems count]
。)
我也对您用于设置单元格的代码感到困惑。细胞是可重复使用的。也就是说,您创建一个单元格,然后在每次执行tableView:cellForRowAtIndexPath:
时重新配置它。您的代码为列表中的每个项目创建一个单元格。这是非常低内存效率的,如果你像这样在内存中保留大量单元格,可能会由于 iPhone 上的内存不足而导致你的程序崩溃。
推荐的方法是致电dequeueReusableCellWithIdentifier:
。如果返回nil
,那么您使用initWithFrame:reuseIdentifier:
初始化程序设置一个单元格。表格视图非常智能,只会在需要时要求您重绘单元格。
你的recentCellData
字典在我看来也很不稳定。如果您在带有键@"2"
的项目之后插入一个项目怎么办?所有带有@"3"
键的项目都需要向右移动一个元素才能按您期望的方式工作。这是大量的簿记,对我来说似乎相当不必要。如果您真的需要这样的东西 - 并且明确地说,我认为您不需要 - 为什么不使用更容易使用的NSMutableArray
?
【讨论】:
我正在使用 NSMutableArray。这一切都与视图的显示方式有关。如果我退出应用程序并重新启动,一切都会按原样显示。 我指的是recentCellData。那是一本字典。【参考方案3】:我在上面添加了更多信息。
【讨论】:
以上是关于iPhone SDK:使用新行插入和更新 UITableView的主要内容,如果未能解决你的问题,请参考以下文章