我正在尝试模拟Spotlight在Yosemite中的工作方式,其中NSTextField(搜索字段)在按下向上/向下箭头键并向上和向下移动tableview选项时始终保持焦点.
我已经实现了以下代码:
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector { if (commandSelector == @selector(moveUp:)) { // move up return YES; } else if(commandSelector == @selector(moveDown:)){ // move down return YES; } return NO; }
虽然我可以使用它然后向上/向下移动行选择,例如:
[self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:currentRow ± 1] byExtendingSelection:NO];
我遇到的问题是我创建了不应该选择的Section Header行,并且我已经使用NSTableViewDelegate方法禁用了这些行的选择:
- (BOOL)tableView: (NSTableView *)tableView shouldSelectRow: (NSInteger)row
但是,即使委托方法表明无法选择行,selectRowIndexes:indexSetWithIndex:currentRowbyExtendingSelection:方法也会选择标题行.
无论NSTableViewDelegate说什么,似乎你仍然可以以编程方式选择行.我想要的是选择跳转标题行.
如果NSTableView是第一个响应者,则内置键盘控件会跳过标题行.
所以我的问题是有没有办法将上/下事件转发到NSTableView,以便移动选择的内置机制有效?
解决方法
以下适用于我,但我不确定是否有任何副作用.
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector { if (commandSelector == @selector(moveUp:)) { // move up [_tableView keyDown:[NSApp currentEvent]]; return YES; } else if(commandSelector == @selector(moveDown:)){ // move down [_tableView keyDown:[NSApp currentEvent]]; return YES; } return NO; }