Изменить поведение клавиши ввода в NSTableView - PullRequest
2 голосов
/ 21 октября 2011

Я пытаюсь создать простое приложение для ввода данных для Mac (не iPhone). У него есть NSTableView (внутри NSScrollView), который содержит NSTextField, в котором пользователь вводит данные построчно.

То, что у меня есть, работает нормально, за исключением того, что для того, чтобы на самом деле можно было что-то ввести в текстовое поле, сначала нужно нажать клавишу «Ввод». Затем, когда вы нажимаете клавишу «Ввод» в конце, поле выходит из режима «редактирования», но выделение просто находится в той же строке. Необходимость нажимать «Ввод», «стрелка вниз», «Ввод» между каждой строкой вводимых данных не очень эффективна.

Я бы предпочел, чтобы при нажатии клавиши «Ввод» курсор перемещался вниз к следующей строке, и поле автоматически переводилось в режим «редактирования».

Я думал, что это должно быть довольно просто, но я весь вечер рвал на себе волосы без какого-либо прогресса, и я до сих пор даже не знаю, куда мне идти.

Я попытался найти некоторые настройки атрибутов в «инспекторах» в XCode, но ничего не увидел.

При поиске в Интернете предложения, похоже, все время возвращались к использованию First Responder. Поэкспериментируя с этим, мне только удалось заставить синее кольцо подсветки перемещаться вокруг моего TableView по требованию, но это все еще не переводит текстовое поле в режим редактирования и не перемещается на другую строку.

Наконец-то я нашел некоторую информацию о создании подклассов и реализации ваших собственных текстовых полей, но это кажется очень долгим и запутанным способом достижения этого.

Может ли кто-нибудь указать мне правильное направление относительно того, как это сделать?

Возможно, я использую неправильный вид контроля? Возможно, что-то еще более уместно. Обратите внимание, что каждая строка отличается, поэтому мне не нужны такие вещи, как перенос слов и т. Д.

1 Ответ

1 голос
/ 21 октября 2011

Вы были на правильном пути с Первым ответчиком, но важно, чтобы редактирование текста не обрабатывалось полевым редактором окна (экземпляр NSTextView), который становится первым респондентом, когда начинается редактирование текста.Редактор полей информирует своего клиента (в данном случае ваш табличный вид) во время редактирования.

Самый простой способ справиться с этим - создать подкласс NSTableView и переопределить его textDidEndEditing: метод.Примерно так должно начаться:

- (void) textDidEndEditing:(NSNotification *)notification {
    [super textDidEndEditing:notification];

    int textMovement = [[notification.userInfo valueForKey:@"NSTextMovement"] intValue];
    if (NSReturnTextMovement == textMovement) {

        NSText *fieldEditor = notification.object;

        // The row and column for the cell that just ended editing
        NSInteger row = [self rowAtPoint:fieldEditor.frame.origin];
        NSInteger col = [self columnAtPoint:fieldEditor.frame.origin];       

        if (++col >= self.numberOfColumns) {
            col = 0;
            if (++row >= self.numberOfRows) return;
        }

        [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] 
            byExtendingSelection:NO];
        [self editColumn:col row:row withEvent:nil select:YES];
    }

}

Это будет проходить слева направо, сверху вниз по столбцам и строкам таблицы.Хотя вы сказали, что используете NSTextField, я предполагаю, что вы имели в виду, что вы используете NSTextFieldCell в таблице на основе ячеек.Это еще одно важное различие.Если вы не знакомы с концепцией редактора полей, я предлагаю вам прочитать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...