Mac OS X NSTabView:如何显示TabItem的键盘导航视图?
我有一个TabView,可以正常使用鼠标。我想让NSTabView支持键盘导航。
使用箭头键移动各种TabItems,但不会导致TabItem视图 出现。我需要点击标签才能显示标签的视图。
使用箭头键时,NSTabViewDelegate方法
tabView:shouldSelectTabViewItem:
调用并返回YES。没有调用其他NSTabViewDelegate方法,因此不显示其View。
什么是获取鼠标单击(显示视图)操作时最佳/推荐的方法 使用键盘到达TabItem?可以在Xcode中修复 或者我是否必须涉及子类化和/或通知?
答案 0 :(得分:0)
在MyAppController(mainWindow)内部,应用程序最初使用此代码来设置editRecipeController的窗口,一个NSPanel
//将CodeWindow作为工作表启动的原始代码
[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。 Panel使用鼠标功能齐全。它有一个五个Tab NSTabView。一个选项卡有一个NSTextField,三个选项卡有一个NSTextView。第五个有NSTableView。
当用户使用ArrowKey从Tab导航到Tab时,我遇到的问题如下: 正确的选项卡是突出显示的,但没有被“选中”,也就是说,它的视图不是 显示。使View显示的唯一方法是用鼠标单击Tab。
My goal is to have full keyboard support for the NSTabView
我能够通过以下方式获得NSTabView的正确行为: Hillegass'Book,Chapter 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
}