我有一个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;
}
更新表格的最佳方法是什么,避免重复当前可见的行。 提前感谢您的帮助!
答案 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)
我在上面添加了更多信息。