2009-09-23 39 views
0

我有一个工具栏中的刷新按钮,重新生成NSArray并尝试重新加载表的内容。UITableView不重装部分和内容

不过,我是否具备:

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]; 
... 

我对accessoryView的方法称为-imageViewForObjectDetailType,刚刚返回a UIImageView

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

是否有retain和/或release我缺少的消息?

回答

1

我敢肯定,你检查这一点,但我看到这样的随机行为,如果我有没有保留,并传递到一个tableview中的NSArray。在您添加的代码

来看,我看不出有什么不对的第一眼 - 这里有一些提示:

1.In:

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

如果对象是一个@propertyretain属性,那么你再也不需要retain它。不是为什么它会失败。

2.In你cellForRowAtIndexPath:,你必须是这样的:只是如果(细胞==零)之前

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

,对不对?

,当你在

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

4.Break从阵列中得到它这件事上多行,并期待在所有返回值与NSLog确保3.You可能要NSLog对象的值每次刷新时都会成功。

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

5.Double检查是为了确保您的抓取是让你你所期望的:

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

可以NSLog[_objectSet count]观看看到一个不成功的刷新是否给你一个不好的计数。

希望这会有所帮助。

+0

我已经添加了代码,显示了我如何设置我的'NSArray'。它看起来像我失去了一些东西?谢谢! – 2009-09-23 09:10:57

+0

我在错误的地方进行了'if(cell == nil)'测试。我有一个switch-case树,必须将条件移动到每个case块。感谢您彻底的想法。 – 2009-09-23 18:01:25

+0

好侦探! – mahboudz 2009-09-23 19:43:59