2013-07-22 1 views
1

Я потратил часы на поиск решения без какой-либо удачи. Я пытаюсь удалить строку (также отменить выбор той же строки) программно. После вызова удаления строки ниже, методы UITableViewDelgate вызывают ожидаемо и источник данных обновляется, но UITableView не обновляется. Вызов deselectRowAtIndexPath также не работает. Я пробовал все виды сценариев, как показано в комментариях.Удаление строки не обновляет таблицу в приложении ios

Это мой код: checkoutPerson вызван в результате того, что наблюдатель прослушивает сообщения NSNotificationCenter.

- (void) checkoutPerson: (NSNumber*) personId { 
Person *person = [_people objectForKey:personId]; 
if(person) 
{ 
    // Remove person from data source 
    int rowIndex = person.rowIndex; 
    S2Log(@"Deleting row number=%d", rowIndex); 
    [_allKeys removeObjectAtIndex:rowIndex]; 
    [_people removeObjectForKey: personId]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowIndex inSection:0]; 

    //[[self tableView] beginUpdates]; 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    S2Log(@"Deleting indexPath row=%d", [indexPath row]); 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
    //[[self tableView] endUpdates]; 
    S2Log(@"Reloading data"); 
    //[[self tableView] reloadData]; 
    //[self performSelector:@selector(refreshView) withObject:nil afterDelay:1.5]; 
    //[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES]; 
} 

}

Я буду признателен за помощь. Thanks -Virendra

Я считаю, что удаленная ячейка не перерабатывается. Если я удаляю строку посередине, последняя строка всегда удаляется (так как есть еще один элемент), но удаленная строка остается.

+0

Вы подтвердили, что этот код действительно называется? Если да, уверены ли вы, что 'self.tableView' не' nil'? Если это не 'nil', это различные методы источника данных табличного представления, вызванные после вызова' deleteRowsAtIndexPAth'? Отражают ли эти звонки обновленные данные? – rmaddy

+0

Абсолютно верно! – user2141071

+0

Я задал несколько вопросов. К чему относится ваше «да»? – rmaddy

ответ

0

Используйте приведенный выше код между двумя функции для просмотра таблицы

[tableView beginUpdates]; 

// the deletion code from data source and UITableView 

[tableView endUpdates]; 

Называя эти функции вы говорите UITableView, что вы собираетесь сделать обновления для удаления вашей ячейки.

Редактировать

Другая проблема, которую я вижу с кода сначала удалить данные из источника данных.

Теперь вы просите за UITableViewCell (который на самом деле перезагружает UITableView) , а затем при удалении строки из UITableView

Я думаю, вы должны принести UITableViewCell перед удалением значения из источника данных.

+0

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

0

Я нашел проблему. Это не имеет никакого отношения к коду, который я написал выше. Это проблема синхронизации между визуальным отображением и содержимым источника данных. У меня встроенный UITableView как часть составного представления. В контроллере составного представления я подключил делегат UITableView и источник данных к экземпляру UITableViewController. Вместо этого я должен был установить свойство tableView UITableViewController во встроенный UITableView. Кажется, что UITableView должен содержаться в UITableViewController, чтобы правильно синхронизировать визуализацию табличного представления с содержимым источника данных. Это также фиксирует выбор и прокрутку строки. Мне также нужно было задержать reloadData-вызов, и в этом случае deleteRowsAtIndexPaths: withRowAnimation не требуется. Все, что вам нужно, это изменить содержимое вашего источника данных и вызвать reloadData с задержкой в ​​1,5 секунды.

Спасибо за помощь.