2013-11-30 5 views
7

Я использую UISegmentedControl для переключения UITableView между двумя наборами данных (думаю, избранные и повторы). Нажатие сегментированного элемента управления перезагружает табличное представление с помощью другого набора данных.Кнопка удаления UITableViewCell не исчезает

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:anim]; 

Когда пользователь удаляет строку, она отлично работает. HOWEVER, когда пользователь переключает наборы данных через сегментированный элемент управления, DELETED CELL повторно используется без изменения его внешнего вида (т. Е. Красная кнопка «DELETE» все еще существует, а содержимое строки нигде не видно). Кажется, это противоположная проблема, которую большинство людей видят, что кнопка удаления не появляется.

Это код удаления:

- (UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewCellEditingStyleDelete; 
} 

- (void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     if ([self.current isEqualTo:self.favorites]) 
     { 
      Favorite *fav = self.favorites[indexPath.row]; 

      NSMutableArray *mut = [self.favorites mutableCopy]; 
      [mut removeObjectAtIndex:indexPath.row]; 
      self.favorites = mut; 
      self.current = self.favorites; 
      [self.tableView deleteRowsAtIndexPaths:@[indexPath] 
            withRowAnimation:UITableViewRowAnimationAutomatic]; 
     } 
    } 

} 

TableView установлен на одиночный выбор и self.tableView.editing == NO. Я также пытался использовать [self.tableView reloadData] и удалять/вставлять разницу в строках из одного набора данных в следующий. Ничего не работает.

UITableViewCell Я использую материалы не Changed не backgroundView или selectedBackgroundView


[EDIT]

сегментированные Control Value:

- (IBAction)modeChanged:(id)sender 
{ 
    if (self.listMode.selectedSegmentIndex == 1) 
    { 
     self.current = self.favorites; 
    } 
    else 
    { 
     self.current = self.recents; 
    } 
    // Tryin this: 
    [self.tableView reloadData]; 
    // Tried this: 
    // [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]; 
} 

// Only 1 Section per table 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
{ 
    return [self.current count]; 
} 
+1

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

+0

@rmaddy Я добавил код - это относительно просто. –

+0

Попробуйте вызвать 'self.editing = NO' перед вызовом' reloadData' – rmaddy

ответ

1

Я столкнулся с тем же: «удалить» пользовательский UITableViewCell, я удалял его из таблицы и помещал в другой список, который пользователь мог отображать в модальном виде, когда они сожалеют и хотят положил его обратно. В iOS7 (но не iOS6) у таких перемещенных клеток была большая уродливая кнопка «DELETE», несмотря на вызов setEditing: НЕТ и т. Д. (И, кроме того, остальная часть содержимого ячеек не была вообще нарисована, хотя проверка ячеек в отладчике показала, что все субпанели все еще там.)

В отличие от Стивена выше, я не переопределил prepareForReuse, так что это не проблема. Но это было связанно: в моем случае, клетки не были созданы с идентификатором повторного использования:

self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

И согласно документации, «Если объект клетки не имеет соответствующий повторное использование идентификатора, этот метод не вызывается «. Но, по-видимому, в iOS7 по крайней мере, это должно be.

Таким образом, решение в моем случае состояло в том, чтобы явно вызвать эту ячейку prepareForReuse в каждой ячейке, когда я загрузил ее в новую таблицу.

21

Oh для любви ...

Я не звонил [super prepareForReuse]; в моем подклассе UITableViewCell.

UGH.

+0

У меня есть то, что похоже на очень схожую проблему ... но я не переопределил prepareForReuse, и на самом деле я указываю nil для моего reuseIdentifier, поэтому согласно к документам, он все равно не будет вызван. –

+0

Ага - это было на правильном пути. Но я буду публиковать свои выводы как отдельный ответ, для ясности. –

+1

Точно моя проблема. Спасибо, что спасли мне волосы! – phatmann

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