2009-09-23 36 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