工具栏中有一个刷新按钮,用于重新生成NSArray
并尝试重新加载表的内容。
但是,我是否:
if (boolCondition) {
[self refreshTableDataSet];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kTableSectionOfInterest] withRowAnimation:UITableViewRowAnimationFade];
}
或:
if (boolCondition) {
[self refreshTableDataSet];
[self.tableView reloadData];
}
关于每次刷新表的其他尝试都失败了。有时候它有效,有时候不行。
我在NSLog
中有一些-tableView:cellForRowAtIndexPath:
语句,让我知道何时触发此方法。刷新失败时,我看不到这些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
的accessoryView方法,只返回UIImageView
:
return [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"GenericObjectDetailType.png"]] autorelease];
我缺少retain
和/或release
条消息吗?
答案 0 :(得分:1)
我确定你已经检查了这一点,但如果我的NSArray
未被保留并传递给tableview,我会看到这样的随机行为。
看看你添加的代码,乍一看我没有看到任何错误 - 这里有一些提示:
1.In:
self.objects = [[[_objectSet allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObjects: _objectTypeSorter, nil]] retain];
如果对象是具有@property
属性的retain
,则您无需再次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.请仔细检查以确保您的抓取能够满足您的期望:
NSSet *_objectSet = [managedObjectContext fetchObjectsForEntityName:@"Object" withPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"group.name like '%@'", [group name]]]];
您可NSLog
[_objectSet count]
观看不成功的刷新是否会给您带来不良影响。
希望这有帮助。