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 不重新加载部分和内容的主要内容,如果未能解决你的问题,请参考以下文章
从 XIB 加载的 UITableView Sectionheader 有时显示不正确