Я пытался решить эту проблему несколькими способами, но в каждом случае событие editableCellDidEndEditing: cell: всегда обрабатывалось после того, как изменения были зафиксированы. Я попытался изменить порядок своего кода, чтобы увидеть, смогу ли я обработать событие раньше. Я попытался заменить метод doneSave двумя методами, где первый метод, willSaveOnExit , ставит в очередь событие для вызова второго метода, didSaveOnExit . Идея заключалась в том, чтобы поместить операцию фиксации в didSaveOnExit и поместить событие в очередь после editableCellDidEndEditing .
К сожалению, я обнаружил, что событие, вызывающее editableCellDidEndEditing: ячейка , никогда не генерировалось, пока контроллер представления не был извлечен и не появилось предыдущее представление. Поэтому пытаться изменить порядок событий было бессмысленно. Я потерял терпение, пытаясь найти способ обойти это, потому что я не мог придумать, как связываться с контроллером детального представления о том, что появилось предыдущее представление. (Возможно, я мог бы это понять, но в то время я не чувствовал себя слишком творчески в этом направлении.)
Ничего из вышеперечисленного не было необходимо, в конце концов.
Вот что я в итоге сделал:
(что очень похоже на то, что я предложил в моем вопросе)
Я создал ivar в tableviewcontroller с именем currentCell, который я установил в методе editableCellDidBeginEditing: cell: , указывая на ячейку, где выполняется редактирование.
currentCell инициализируется нулем в viewDidAppear
Я изменил этот код (см. Мой вопрос для оригинала), оборачивая код в условное
- (void)editableCellDidEndEditing:(EditableCell *)cell {
if (currentCell){
[clientMO setValue:currentCell.textField.text forKey:currentCell.keyName]; // update the value
}
}
Я изменил метод обработчика кнопки Сохранить на этот
- (void) doneSave {
[self editableCellDidEndEditing:currentCell];
currentCell = nil;
[dataInterface commitChangesAndNotify:@"clientUpdate"];
[self.navigationController popViewControllerAnimated:YES];
}
(добавление первых двух строк к версии в моем вопросе)
Теперь я знаю, что если была нажата кнопка сохранения, то пользователь завершил редактирование, поэтому я хочу вызвать editableCellDidEndEditing: cell: в последний раз перед тем, как зафиксировать изменения . Но поскольку мой код вызывает (а не обработчик событий), я должен предоставить указатель ячейки, который я получил, когда началось редактирование ячейки, и поместил в currentCell.
Затем я установил currentCell на ноль, указывая, что больше нет текущей ячейки. Теперь, помните, что я сказал, что все еще будет событие, поставленное в очередь для editableCellDidEndEditing: cell: к моменту появления предыдущего представления. Когда этот метод выполняется, условный тест для currentCell (! = Nil) падает, и код обходит.
Итак, в конце концов, кажется, что все работает в правильном порядке, даже несмотря на то, что избыточный вызов editableCellDidEndEditing: cell: все еще происходит.
Сейчас я счастлив.