聚焦一个 NSTextField
Posted
技术标签:
【中文标题】聚焦一个 NSTextField【英文标题】:focus a NSTextField 【发布时间】:2009-04-18 20:51:12 【问题描述】:我有一个 NSTextField,如果我点击一个按钮,我想设置它的内容,而不是将光标设置在文本末尾的这个文本字段上,这样如果有人点击了这个按钮,他就可以开始输入了。
直到现在我使用 [NSTextField selectText] 它选择了这个文本字段,但它选择了整个文本,所以如果有人刚刚开始输入,他会丢失文本字段中已经存在的所有文本。
【问题讨论】:
【参考方案1】:甚至更简单
[yourTextField becomeFirstResponder];
【讨论】:
这样做的问题是这会选择所有文本,如果您开始键入预填充的文本将被覆盖,我想将光标设置在文本后面。 此方法在 10.5 中已弃用,此外,如果您阅读此方法的文档,它会非常清楚地说明“永远不要直接调用此方法。” 好点,Alan,我刚刚使用 10.8 SDK 删除了一些直接使用 becomeFirstResponder 引发异常的调用。【参考方案2】:好的,我现在发现了:)
- (IBAction)focusInputField:(id)sender
[textField selectText:self];
[[textField currentEditor] setSelectedRange:NSMakeRange([[textField stringValue] length], 0)];
在 RubyCocoa 中是:
def select_input_field
@input.selectText self
range = OSX::NSRange.new(@input.stringValue.length, 0)
@input.currentEditor.setSelectedRange range
end
【讨论】:
【参考方案3】:你会想做这样的事情:
[[self window] makeFirstResponder:[self yourTextField]];
【讨论】:
这也选择了文本:-/【参考方案4】:我正在写一个游戏插件,我遇到了类似的问题:
- (void)gotEvent:(NSEvent *)newEvent
[mainWindow makeKeyAndOrderFront:self];
[mainWindow makeFirstResponder:messageField];
[mainWindow sendEvent:newEvent]; // will forward the typing event
这样就可以了 :)
【讨论】:
你从哪里调用 gotEvent?【参考方案5】:前段时间我做过类似的任务。我的解决方案是为 NSTextField 的部分文本选择写下小类别方法。此方法的作用与原始 selectText: 类似(将焦点设置为控制)。
@implementation NSTextField( SelExt )
-(void)selectTextRange:(NSRange)range
NSText *textEditor = [self.window fieldEditor:YES forObject:self];
if( textEditor )
id cell = [self selectedCell];
[cell selectWithFrame:[self bounds] inView:self
editor:textEditor delegate:self
start:range.location length:range.length];
@end
使用这种方法,您可以将文本选择放置在您想要的位置,然后立即开始输入。
【讨论】:
以上是关于聚焦一个 NSTextField的主要内容,如果未能解决你的问题,请参考以下文章