Mac OS X NSPanel с клавиатурой NSTabView Событие: как использовать NSTabViewDelegate для отображения представления TabItem для навигации по клавиатуре?

Mac OS X NSTabView: как отобразить представление TabItem для навигации с помощью клавиатуры?

У меня есть TabView, который отлично работает с мышью. Я хочу, чтобы NSTabView поддерживал навигацию с клавиатуры.

Использование клавиши со стрелкой перемещает различные элементы TabItems, но не приводит к отображению представления TabItem. Мне нужно нажать на вкладку, чтобы показать вид вкладки.

При использовании клавиши со стрелкой метод NSTabViewDelegate

tabView:shouldSelectTabViewItem:

вызывается и возвращает YES. Никакой другой метод NSTabViewDelegate не вызывается, поэтому его View не отображается.

Каков наилучший / рекомендуемый способ вызвать действие щелчка мыши (показать представление) при достижении TabItem с помощью клавиатуры? Это может быть исправлено в XCode, или я должен вовлечь подклассы и / или уведомления?

1 ответ

Решение

Внутри MyAppController (mainWindow) приложение изначально использовало этот код для создания окна editRecipeController, NSPanel

// Исходный код для запуска EditWindow в виде листа

    [NSApp beginSheet:[editController window] modalForWindow:[self window] modalDelegate:nil didEndSelector:nil contextInfo:nil];
    [NSApp runModalForWindow:[editController window]];
    // sheet is up here...
    [NSApp endSheet: [editController window]];
    [[editController window] orderOut:nil];
    [[editController window] close];

Внутри окна, NSPanel, есть NSTabView. Панель полностью функционирует с помощью мыши. Он имеет пять вкладок NSTabView. Одна вкладка имеет NSTextField, три вкладки имеют NSTextView. Пятый имеет NSTableView.

Проблема, с которой я столкнулся, заключалась в следующем, когда пользователь переходил от вкладки к вкладке с помощью клавиши со стрелкой, соответствующая вкладка была выделена, но не стала "выделенной", то есть ее вид не отображался. Единственный способ отобразить представление - щелкнуть мышью на вкладке.

My goal is to have full keyboard support for the NSTabView

Мне удалось получить правильное поведение для NSTabView, выполнив следующие действия: Книга Хиллегаса, глава 25, "Листы.

    // MyAppController.m  - WindowController for mainWindow

    - (IBAction) editRecipeAction:(id)sender {
        // setup the edit sheet controller if one hasn't been setup already
        if (editRecipeController == nil){
            editRecipeController = [[EditRecipeController alloc] initWithWindowNibName:@"EditRecipe"];
            //[editRecipeController setMyAppController:self];
        }

        [[NSApplication sharedApplication] beginSheet:editRecipeController.window
                     modalForWindow:self.window
                      modalDelegate:editRecipeController
                     didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
                         contextInfo:nil];
    }

// конец MyAppController.m

// EditRecipeController.m

    - (IBAction)cancel:(id)sender
    {

        [NSApp endSheet:self.window returnCode:0 ] ;
        [self.window orderOut:self];
    }

- (void) sheetDidEnd:(NSWindow *) sheet returnCode:(int)returnCode contextInfo:(void *) contextInfo {

   DLog(@"sheet=%@",sheet);

}

Если ваша цель - полная поддержка клавиатуры для такого NSTabView, я думаю, вам понадобится что-то вроде следующего использования метода NSTabViewDelegate:

    - (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem{

        NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
        [f setNumberStyle:NSNumberFormatterDecimalStyle ];
        NSNumber *tabNumber =
        [f numberFromString:tabViewItem.identifier];
        [f release];

        switch (tabNumber.integerValue) {
            case 1:
                editRecipeController.tabView.nextKeyView = editRecipeController.textViewIngredients;
                editRecipeController.textViewIngredients.nextKeyView = editRecipeController.cancelButton;
                editRecipeController.cancelButton.nextKeyView = editRecipeController.doneButton;
                editRecipeController.doneButton.nextKeyView = editRecipeController.tabView;
                break;
            case 2:
                editRecipeController.tabView.nextKeyView = editRecipeController.textViewDirections;
                editRecipeController.textViewDirections.nextKeyView = editRecipeController.cancelButton;
                editRecipeController.cancelButton.nextKeyView = editRecipeController.doneButton;
                editRecipeController.doneButton.nextKeyView = editRecipeController.tabView;
                break;
            case 3:
                editRecipeController.tabView.nextKeyView = editRecipeController.textViewDirections;
                editRecipeController.textViewDirections.nextKeyView = editRecipeController.cancelButton;
                editRecipeController.cancelButton.nextKeyView = editRecipeController.doneButton;
                editRecipeController.doneButton.nextKeyView = editRecipeController.tabView;
                break;
            case 4: // Comments
                editRecipeController.tabView.nextKeyView = editRecipeController.textViewComments;
                editRecipeController.textViewComments.nextKeyView = editRecipeController.cancelButton;
                editRecipeController.cancelButton.nextKeyView = editRecipeController.doneButton;
                editRecipeController.doneButton.nextKeyView = editRecipeController.tabView;
                break;
            case 5: //Categories - Table can not be edited 
                editRecipeController.tabView.nextKeyView = editRecipeController.cancelButton;
                editRecipeController.cancelButton.nextKeyView = editRecipeController.doneButton;
                editRecipeController.doneButton.nextKeyView = editRecipeController.tabView;
                break;
            default:
                DLog(@"switch value error");
                break;
        }// end switch

    }
Другие вопросы по тегам