Пользовательский редактор полей для NSTextFieldCell в NSTableView - PullRequest
4 голосов
/ 01 июля 2010

У меня есть пользовательский подкласс 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, он никогда не будет вызывается. Почему нет?

Ответы [ 5 ]

4 голосов
/ 02 июля 2010

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

- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector {
    if(aSelector == @selector(moveUp:)) {
        [self moveSelectionToPreviousRow];
        return YES;
    } else if(aSelector == @selector(moveDown:)) {
        [self moveSelectionToNextRow];
        return YES;
    } else if(aSelector == @selector(moveLeft:)) {
        [self moveSelectionToPreviousColumn];
        return YES;
    } else if(aSelector == @selector(moveRight:)) {
        [self moveSelectionToNextColumn];
        return YES;
    }
    return NO;
}

Это потому, что редактор полей по умолчанию - NSTextView (не NSControl)поэтому мне нужно было использовать протокол <NSTextViewDelegate>.Представление, которое установлено в качестве его делегата, является NSTableView, , а не NSTextFieldCell.moveSelectionTo... функции - это пользовательские функции, определенные в моем подклассе NSTableView, которые отслеживают текущую отредактированную ячейку и затем перемещают ее соответствующим образом.

1 голос
/ 24 июля 2012

Возможно связанная запись в документации Apple:

setFieldEditor:

Управляет поведением текстовых представлений, совместно использующих менеджер компоновки приемника, как полевых редакторов.

- (void)setFieldEditor:(BOOL)flag

Параметры

flag : YES, чтобы текстовые представления, совместно использующие менеджер компоновки приемника, работали как полевые редакторы, NO в противном случае.

Обсуждение

Полевые редакторы интерпретируют Tab, Shift-Tab и Return (Enter) как сигналы для завершения редактирования и, возможно, для изменения первого респондента. Редакторы, не являющиеся полями, вместо этого принимают эти символы в качестве ввода текста. См. «Текстовые поля, текстовые представления и редактор полей» для получения дополнительной информации о редакторах полей. По умолчанию текстовые представления не ведут себя как полевые редакторы.

0 голосов
/ 20 марта 2017

Ответ на более общее название этого вопроса можно найти в этом ответе: https://stackoverflow.com/a/8865953/43615

По существу, один подкласс NSTextFieldCell и переопределяет fieldEditorForView:, где каждый просто создает собственный подкласс NSTextView и устанавливает его свойство fieldEditor в YES.

0 голосов
/ 17 июня 2015

Самый простой способ выполнить то, что вам нужно, это реализовать control:textView:doCommandBySelector: в делегате табличного представления.

См. Также мой ответ на аналогичный вопрос здесь: Клавиши со стрелками с NSTableView

0 голосов
/ 01 июля 2010

Они должны быть переопределены в keyDown:(NSEvent *)event методе вашего подкласса NSTextFieldCell объекта.Вы проверяете нажатую клавишу (одну из стрелок) и в противном случае набираете до super.

...