После некоторого обсуждения здесь , звучит как несколько возможных способов сделать это:
- Поместите категорию в класс модели и переопределите validateMyKey
- Подклассы NSFormCell
Я пробовал оба. Больше вопросов:
- validateMyKey не вызывается до тех пор, пока не обновится сама модель, поэтому старое значение недоступно.
editWithFrame:inView:editor:delegate:event:
не всегда вызывается при вводе поля, поэтому трудно получить доступ к старому значению в endEditing:
.
Новое решение - уточнение моего оригинального # 2: делегат редактирования текста, реализующий NSControlTextEditingDelegate
.
Вместо controlTextDidBeginEditing:
и controlTextDidEndEditing:
реализовать только control:textShouldEndEditing:
. В этом методе при необходимости измените текст, затем верните YES.
Я создаю это в кончике и делаю его делегатом формы (а не клеткой). В приведенном ниже коде я получаю старое значение, используя infoForBinding:
, но если вы не используете привязки, вы можете вместо этого добавить выход к объекту модели.
-(BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor {
NSCell *cell = [(NSForm *)control selectedCell];
NSString *identifier = [(NSCell *)[(NSForm *)control selectedCell] identifier];
if (!identifier) return YES;
NSDictionary *bindingInfo = [cell infoForBinding:@"value"];
if (!bindingInfo) return YES;
NSString *oldValue = [[bindingInfo valueForKey:NSObservedObjectKey] valueForKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];
NSString *newValue = cell.stringValue;
if ([identifier isEqualTo:@"firstField"]) {
if (criteria)
cell.stringValue = ....;
} else if ([identifier isEqualTo:@"secondField"]) {
if (criteria)
cell.stringValue = ....;
}
return YES;
}