#iphone #ios #core-data
#iPhone #iOS #core-data
Вопрос:
Допустим, у меня есть база данных сотрудников, где сотрудник может быть менеджером отдела. Связь менеджера отдела (с сотрудником в роли менеджера) не является необязательной. Итак, я не могу удалить сотрудника, когда он является менеджером подразделения.
В моем UITableViewDelegate
я хотел бы иметь:
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView
editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self mayDeleteTableView:tableView entryAtIndexPath:indexPath] ?
UITableViewCellEditingStyleDelete : UITableViewCellEditingStyleNone;
}
Где mayDeleteTableView:entryAtIndexPath
возвращается NO
, когда сотрудник является менеджером отдела, в противном случае YES
.
Теперь, конечно, я могу реализовать этот метод, настроив запрос на выборку, который сообщает мне, чего я хочу. Но я просто подумал, есть ли более простой способ, чем этот, потому что core-data должен иметь какой-то механизм, чтобы точно это выяснить, иначе это не могло бы вызвать ошибку, когда я удаляю объект, который я не должен.
Итак, мой вопрос таков: «Предлагает ли core data каким-либо образом реализацию mayDeleteTableView:entryAtIndexPath
для меня?»
Обновление: Хорошо, на самом деле я нашел NSManagedObject:validateForDelete
метод сейчас. Кажется, что он возвращается всегда NO
. Итак, теперь мой вопрос таков: «Должен ли я реализовать validateForDelete
или это должно выполнить правильную проверку для меня (в этом случае я делаю что-то еще неправильно)?»
Комментарии:
1. Хорошо, я делаю что-то еще неправильно. На самом деле, использование
validateForDelete
кажется идеальным.2. Если
validateForDelete:
возвращает NO, оно должно сопровождаться соответствующей ошибкой о том, почему. О чем говорится в ошибке?
Ответ №1:
Если вы настроили атрибут manager как BOOL или что-то подобное, вы можете проверить свой TableView на соответствие этому. После получения ссылки на сотрудника через TableView, что-то простое, например
return [[[fetchController objectAtIndexPath:indexPath] manager] boolValue] ? UITableViewCellEditingStyleNone : UITableViewCellEditingStyleDelete;
Здесь я предполагаю, что вы получаете объект core data через NSFetchResultsController, но независимо от того, как вы его собираете, это должна быть та же логика. Я надеюсь, что это поможет
Комментарии:
1. Хорошо, это звучит разумно. Если я установлю для «managesDepartment» в employee отношение, обратное отношению к отношению «менеджер» в отделе, я мог бы просто проверить, является ли это пустым. Спасибо.
2. На самом деле, возможно, было бы лучшей идеей настроить свойство BOOL
isManager
для каждого сотрудника. Я говорю это только потому, что при сохранении вашего managedObjectContextnil
значения имеют тенденцию приводить к сбою системы. Итак, если вы настроили свойство BOOL, у вас всегда будет илиYES
илиNO
, поэтому сохранение контекста будет безопасным. Это также должно позволить вам использовать приведенный выше код в моем ответе вместо того, чтобы использоватьvalidateForDelete:
метод3. Что ж, похоже, что validateForDelete не работает. Я обнаружил, что он также не предназначен для этого использования. Смотрите bit.ly/iWmdsq