0

Mac OS X NSTabView: キーボード ナビゲーション用に TabItem のビューを表示するにはどうすればよいですか?

マウスで問題なく動作する TabView があります。NSTabView でキーボード ナビゲーションをサポートしたいと考えています。

矢印キーを使用すると、さまざまな TabItem 間を移動しますが、TabItem ビューは表示されません。タブのビューを表示するには、タブをクリックする必要があります。

矢印キーを使用すると、NSTabViewDelegate メソッド

tabView:shouldSelectTabViewItem:

が呼び出され、YES が返されます。他の NSTabViewDelegate メソッドは呼び出されないため、そのビューは表示されません。

キーボードを使用して TabItem に到達したときにマウス クリック (ビューを表示) アクションを実行するための最良/推奨の方法は何ですか? これは Xcode で修正できますか、それともサブクラス化や通知を含める必要がありますか?

4

1 に答える 1

0

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 があります。パネルは、マウスを使用して完全に機能します。5 つのタブ NSTabView があります。1 つのタブには NSTextField があり、3 つのタブには NSTextView があります。5 番目には NSTableView があります。

ユーザーが矢印キーを使用してタブからタブに移動すると、適切なタブが強調表示されましたが、「選択」されませんでした。つまり、そのビューが表示されませんでした。ビューを表示する唯一の方法は、タブをマウスでクリックすることでした。

My goal is to have full keyboard support for the NSTabView

以下に従って、NSTabView の適切な動作を得ることができました: Hillegass' Book 、第 25 章、「Sheets.

    // 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

    }
于 2012-12-05T04:27:03.480 に答える