Обработка удаления строки в UITableViewController - PullRequest
0 голосов
/ 06 мая 2010

У меня есть UINavigationController. Первый уровень - это UITableViewController, второй уровень просто показывает детали одного из элементов табличного представления.

В этом подробном представлении я могу удалить элемент. Удаляет базовый управляемый объект.

Когда я возвращаюсь к представлению, у меня происходит сбой. Я понимаю почему, потому что я не обновлял кэшированный массив, содержащий данные.

Я посмотрел несколько уроков, и я не совсем понимаю, как я должен обрабатывать удаление. Может быть, я не совсем понимаю, где я должен получить объекты в модели. Должен ли я сделать запрос для каждого cellForRowAtIndexPath и взять элемент в результате в позиции indexPath.row? Это не выглядит эффективным. Должен ли я где-то проверять изменения и повторять весь запрос в массиве. Я бы подумал, что CoreData предоставит что-то более естественное, но я до сих пор не нашел его.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 07 мая 2010

Это довольно просто. В детском представлении вы должны (действительно, действительно должны) иметь ссылку на NSManagedObject, с которым вы работаете. Если вы хотите удалить его, вы просто:

NSManagedObjectContext *moc = [[self myObject] managedObjectContext];
[moc deleteObject:[self myObject]];
NSError *error = nil;
if (![moc save:&error]) {
  NSLog(@"Save failed: %@\n%@", [error localizedDescription], [error userInfo]);
}

Это удалит объект. Родитель, поскольку он использует NSFetchedResultsController (что вы должны ДЕЙСТВИТЕЛЬНО делать), позаботится о себе сам.

1 голос
/ 20 июля 2010

Если вы не используете NSFetchedResultsController, все, что вам нужно сделать, это реализовать следующий метод:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {</p> <pre><code>if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the managed object at the given index path. NSManagedObject *rowToDelete = [currentRows objectAtIndex:indexPath.row]; [managedObjectContext deleteObject:rowToDelete]; // Commit the change. NSError *error; if (![managedObjectContext save:&error]) { // Handle the error. NSLog(@"Failed to save to data store: %@", [error localizedDescription]); NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; if(detailedErrors != nil && [detailedErrors count] > 0) { for(NSError* detailedError in detailedErrors) { NSLog(@" DetailedError: %@", [detailedError userInfo]); } } else { NSLog(@" %@", [error userInfo]); } } // Update the array and table view. [currentRows removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; }

}

currentRows - это NSArray объектов, отображаемых в таблице.

Приветствия

1 голос
/ 06 мая 2010

Кажется несколько нестандартным удаление элемента в родительском контроллере из вашего детального контроллера, но, возможно, это имеет смысл в вашем случае. Я полагаю, вы знаете, что вы можете напрямую удалять элементы в виде таблицы. Есть много примеров проектов кода от Apple, которые вместе с документами должны дать вам представление, как это сделать.

Чтобы ответить на ваш вопрос, вы можете создать свойство / переменную в классе вашего подробного контроллера, который содержит ссылку на контроллер табличного представления, а затем отправить сообщение этому контроллеру для обработки удаления. Создание протокола для этого было бы хорошим стилем, но не обязательно. Когда класс табличного представления получает сообщение об удалении элемента, он обновляет массив, и когда это представление отображается повторно, вы должны вызвать reloadData для табличного представления. Это стандартная парадигма: внесите изменения в базовую модель данных и попросите tablview перезагрузиться.

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