У меня есть пользовательский подкласс NSTableView
, заполненный несколькими пользовательскими подклассами NSTextFieldCell
. Я хотел бы иметь возможность изменить отредактированную ячейку с помощью клавиш со стрелками.
Я могу сделать это, создав специальный редактор полей (с помощью подкласса NSTextView
) и вернув его из делегата окна следующим образом:
- (id) windowWillReturnFieldEditor:(NSWindow *) aWindow toObject:(id) anObject {
if ([anObject isEqual:myCustomTable]) {
if (!myCustomFieldEditor) {
myCustomFieldEditor = [[MyNSTextViewSubclass alloc] init];
[myCustomFieldEditor setTable:anObject];
}
return myCustomFieldEditor;
}
else {
return nil;
}
}
В MyNSTextViewSubclass
я переопределяю методы moveUp:
, moveDown:
, moveLeft:
и moveRight:
, чтобы реализовать желаемую функциональность, и все это прекрасно работает. Единственная проблема заключается в том, что редактор полей больше не ведет себя как редактор ячеек текстового поля. Например, когда я нажимаю клавишу Enter, он вставляет новую строку в текстовое поле вместо завершения редактирования.
Как мне создать редактор пользовательских полей, который будет отвечать точно так же, как и редактор по умолчанию для NSTextFieldCell
(за исключением тех четырех функций, которые я буду переопределять)? Или есть лучший способ изменить функциональность moveUp:
, moveDown:
, moveLeft:
и moveRight:
?
РЕДАКТИРОВАТЬ: Похоже, что редактор поля устанавливает текстовое поле в качестве его делегата, когда оно выбрано для редактирования. В этом случае может быть полезно просто присоединить метод делегата control:textView:doCommandBySelector:
, как описано здесь , но когда я реализую эту функцию либо в моем подклассе NSTextFieldCell
, либо в моем подклассе NSTableView
, он никогда не будет вызывается. Почему нет?