UITableView 不重新加载部分和内容

Posted

技术标签:

【中文标题】UITableView 不重新加载部分和内容【英文标题】:UITableView not reloading section and contents 【发布时间】:2009-09-23 08:24:21 【问题描述】:

我在工具栏中有一个刷新按钮,它重新生成 NSArray 并尝试重新加载表格的内容。

但是,我是否有:

if (boolCondition) 
   [self refreshTableDataSet];
   [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kTableSectionOfInterest] withRowAnimation:UITableViewRowAnimationFade];

或:

if (boolCondition) 
   [self refreshTableDataSet];
   [self.tableView reloadData];

几乎所有其他刷新表的尝试都会失败。有时有效,有时无效。

我在-tableView:cellForRowAtIndexPath: 中有一些NSLog 语句,让我知道何时触发此方法。当刷新失败时,我看不到这些NSLog 语句的输出。

当我有新数据时,我是否缺少关于重新加载表格视图的内容?

编辑

在我的-refreshTableDataSet 方法中:

- (void) refreshTableDataSet 
   NSSortDescriptor *_objectTypeSorter = [[[NSSortDescriptor alloc] initWithKey:@"object.type" ascending:YES] autorelease];
   NSSet *_objectSet = [managedObjectContext fetchObjectsForEntityName:@"Object" withPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"group.name like '%@'", [group name]]]];
   self.objects = [[[_objectSet allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObjects: _objectTypeSorter, nil]] retain];

在我的表格视图中-tableView:cellForRowAtIndexPath: 方法:

...
Object *_object = [self.objects objectAtIndex:indexPath.row];
if (cell == nil) 
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

cell.textLabel.text = _object.name;
cell.detailTextLabel.text = _object.type;
cell.imageView.image = [UIImage imageNamed:@"GroupType.png"];
cell.accessoryView = [self imageViewForObjectDetailType:_object.type];
...

我有一个名为-imageViewForObjectDetailType 的附件视图方法,它只返回一个UIImageView

return [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"GenericObjectDetailType.png"]] autorelease];

是否有我丢失的retain 和/或release 消息?

【问题讨论】:

【参考方案1】:

我确定您已经检查过了,但是如果我有一个未保留并传递给 tableview 的 NSArray,我会看到这样的随机行为。

查看您添加的代码,乍一看我没有发现任何问题 - 这里有一些提示:

1.在:

self.objects = [[[_objectSet allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObjects: _objectTypeSorter, nil]] retain];

如果对象是带有retain 属性的@property,那么您不需要在这里再次retain。不是为什么它会失败。

2.在您的cellForRowAtIndexPath: 中,您确实有类似的内容:

UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

就在 if (cell == nil) 之前,对吧?

3.你可能想NSLog从数组中获取对象的值

Object *_object = [self.objects objectAtIndex:indexPath.row];

4. 将其拆分为多行,并使用NSLog 查看所有返回值,以确保每次刷新时它们都成功。

self.objects = [[[_objectSet allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObjects: _objectTypeSorter, nil]] retain];

5. 仔细检查以确保您的 fetch 符合您的预期:

NSSet *_objectSet = [managedObjectContext fetchObjectsForEntityName:@"Object" withPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"group.name like '%@'", [group name]]]];

您可以NSLog[_objectSet count] 观看,看看不成功的刷新是否会给您带来错误的计数。

希望这会有所帮助。

【讨论】:

我添加了显示我如何设置NSArray 的代码。看起来我错过了什么吗?谢谢! 我的if (cell==nil) 测试放错了地方。我有一个 switch-case 树,必须将条件移到每个 case 块。感谢您的透彻想法。

以上是关于UITableView 不重新加载部分和内容的主要内容,如果未能解决你的问题,请参考以下文章

iOS:重新加载 UITableView 后滑动显示数据

重新加载 UITableView 而不重新加载标题部分

从 XIB 加载的 UITableView Sectionheader 有时显示不正确

重新加载 UITableView 而不重新加载 Section Header

Swift - 重新加载 UITableView 标题

UITableView 强制 sectionIndex 更新而不调用 reloadData