【发布时间】:2022-05-14 16:57:01
【问题描述】:
我正在使用 NSTextView 来允许多行输入。但是,由于我的应用的性质,用户在按下 TAB 键时会更舒服地移动到下一个输入元素。
如何让 TAB 退出 NSTextView,同时保持 Enter 键的换行行为?
【问题讨论】:
标签: objective-c cocoa nstextview
我正在使用 NSTextView 来允许多行输入。但是,由于我的应用的性质,用户在按下 TAB 键时会更舒服地移动到下一个输入元素。
如何让 TAB 退出 NSTextView,同时保持 Enter 键的换行行为?
【问题讨论】:
标签: objective-c cocoa nstextview
您可以在文本视图的委托中实现-textView:doCommandBySelector::
- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector {
if (aSelector == @selector(insertTab:)) {
[[aTextView window] selectNextKeyView:nil];
return YES;
}
return NO;
}
见http://developer.apple.com/documentation/Cocoa/Reference/NSTextViewDelegate_Protocol
【讨论】:
insertBacktab: 并以类似方式致电selectPreviousKeyView:。
您需要在子类中实现它。
我为Translate Text 写了这样一个子类。欢迎您在its BSD license 下使用它。这是the header 和the implementation file。
...同时保持 Enter 键的换行行为?
我的主要目的是在用户按下 Enter 时向目标发送一个动作,并且我还让它从视图中删除焦点。但是,两者都是代码中的显式语句;您可以简单地注释掉该代码或删除它。
【讨论】:
Wevah 和 Quinn 答案的 Swift 版本:
func textView(_ textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
switch commandSelector {
case #selector(NSResponder.insertTab(_:)):
textView.window?.selectNextKeyView(nil)
return true
case #selector(NSResponder.insertBacktab(_:)):
textView.window?.selectPreviousKeyView(nil)
return true
default:
return false
}
}
【讨论】: