2009-09-23 4 views
0

У меня есть кнопка обновления на панели инструментов, которая восстанавливает NSArray и пытается перезагрузить содержимое таблицы.UITableView не перезагружает раздел и содержимое

Однако, есть ли у меня:

if (boolCondition) { 
    [self refreshTableDataSet]; 
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kTableSectionOfInterest] withRowAnimation:UITableViewRowAnimationFade]; 
} 

или:

if (boolCondition) { 
    [self refreshTableDataSet]; 
    [self.tableView reloadData]; 
} 

О любой другой попытке обновить таблицу не удается. Иногда это работает, иногда нет.

У меня есть NSLog заявления в -tableView:cellForRowAtIndexPath:, чтобы сообщить мне, когда этот метод уволен. Когда обновление завершается неудачно, я не вижу выход этих операторов NSLog.

Есть ли что-то, что мне не хватает в перезагрузке табличного представления, когда у меня есть новые данные?

EDIT

В моем -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

Я уверен, что вы это проверили, но я вижу случайное поведение, подобное этому, если у меня есть NSArray, который не был сохранен и передан в tableview.

Глядя на ваш добавленным код, я не вижу ничего плохого на первый взгляд - вот несколько советов:

1.In:

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

Если объекты является @property с retain атрибут, то вам не нужно снова retain. Не потому, что это потерпит неудачу.

2.In ваш cellForRowAtIndexPath:, у вас есть что-то вроде:

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

только перед если (ячейки == ноль), не так ли?

3.You может понадобиться NSLog значение объекта, когда вы получите его из массива в

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

4.Break это на несколько строк и смотреть на все возвращаемые значения с 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. Похоже, я что-то упустил? Благодаря! –

+0

У меня был тест 'if (cell == nil)' в неправильном месте. У меня есть дерево с коммутационным кодом, и мне пришлось переместить это условие на каждый блок case. Спасибо за ваши тщательные идеи. –

+0

Хорошо следить! – mahboudz

Смежные вопросы