Как программно управлять событием нажатия клавиши TAB на NSPopUpButton

Я разрабатываю приложение для MacOSX с Xcode5.

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

-(BOOL)canBecomeKeyView{
    return YES;
}

Теперь я не могу выбрать свои NSPopupButtons, нажав клавишу Tab, но я также хочу контролировать, куда идти оттуда, в NSTextFields я использую этот метод:

-(BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector{

    NSTextField     *textField  = (NSTextField *) control;

    if (commandSelector == @selector(insertTab:) ||
        commandSelector == @selector(insertNewline:)) {


        if (textField == _diaTextField) {
            [self.window makeFirstResponder:_cantidadDebeTextField];
        }

        if (textField == _cantidadDebeTextField) {
            [self.window makeFirstResponder:_cuentaDebePopupButton];
        }

        if (textField == _cantidadHaberTextField) {
            [self.window makeFirstResponder:_descripcionAsientoTextField];
        }

        if (textField == _descripcionAsientoTextField) {
            [self.window makeFirstResponder:_descripcionBitacoraTextField];
        }

        if (textField == _descripcionBitacoraTextField) {
            [self.window makeFirstResponder:nil];
        }

        return YES;
    }
    return NO;
}

Как вы можете видеть, я управляю навигацией с помощью клавиши TAB, я хочу сделать то же самое с NSPopUpButtons, но я даже не могу установить ни одного из них, как с NSTextFields,

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

есть ли способ контролировать это из кода???

Спасибо за поддержку


person Jesus    schedule 22.08.2014    source источник


Ответы (1)


Выключаете autorecalculatesKeyViewLoop в окне и сами устанавливаете цикл просмотра ключа. Вы делаете это, устанавливая свойство nextKeyView всех ваших представлений. Они должны образовать петлю.

Вероятно, вы также захотите установить initialFirstResponder своего окна.

Когда вы добавляете представление, вам нужно будет настроить цикл ключевого представления, чтобы включить его в нужное положение.

person Ken Thomases    schedule 23.08.2014
comment
autorecalculatesKeyViewLoop у меня отключено по умолчанию, также у меня есть первое представление [_diaTextField beFirstResponder]; когда я загружаю свое представление и ключевой цикл просмотра, когда он статичен, он имеет правильный порядок, но когда я добавляю больше элементов управления, он теряет порядок, поэтому мне нужно установить порядок там программно, с NSTextFields все работает хорошо, но Я не могу установить порядок с помощью NSPopupButtons программно :( - person Jesus; 25.08.2014
comment
Во-первых, вы никогда не должны вызывать -becomeFirstResponder (за исключением вызова super в рамках переопределения). См. документы для этого метода на NSResponder. Либо установите initialFirstResponder окна, либо вызовите -[NSWindow makeFirstResponder:]. Затем, если вы добавляете или удаляете представления из окна и управляете циклом ключевых представлений вручную, вам необходимо вызвать -setNextKeyView: соответствующим образом, чтобы включить новые представления или закрыть все пробелы, оставшиеся после удаления представлений. Техника, которую вы показали для текстовых полей, является очень окольным путем и не будет работать в общем случае. Настройка nextKeyView будет работать. - person Ken Thomases; 25.08.2014