UITableView不重新加载部分和内容

时间:2009-09-23 08:24:21

标签: iphone uitableview

工具栏中有一个刷新按钮,用于重新生成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条消息吗?

1 个答案:

答案 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]观看不成功的刷新是否会给您带来不良影响。

希望这有帮助。