Как да контролирате събитието за натискане на клавиш TAB на NSPopUpButton програмно

Разработвам приложение за MacOSX с Xcode5

Искам да контролирам, когато натискам tab върху избран 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 becomeFirstResponder]; когато заредя изгледа си и ключът View loop when е статичен, той има правилния ред, но когато добавя още контроли, той губи реда, затова трябва да задам реда програмно там, с NSTextFields всичко работи добре, но Не мога да задам реда с NSPopupButtons програмно :( - person Jesus; 25.08.2014
comment
Първо, никога не трябва да извиквате -becomeFirstResponder (освен да извиквате super в рамките на отмяна). Вижте документите за този метод на NSResponder. Или задайте initialFirstResponder на прозореца, или извикайте -[NSWindow makeFirstResponder:]. След това, ако добавите или премахнете изгледи от прозореца и управлявате цикъла на ключовия изглед ръчно, трябва да извикате -setNextKeyView:, както е подходящо, за да включите новите изгледи или да затворите всички пропуски, оставени чрез премахване на изгледи. Техниката, която показахте за текстови полета, е много заобиколен начин и няма да работи в общия случай. Настройка nextKeyView ще работи. - person Ken Thomases; 25.08.2014