聚焦一个 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的主要内容,如果未能解决你的问题,请参考以下文章

为啥在单击事件后聚焦时不应用浏览器默认聚焦样式?

win10怎么把聚焦壁纸设置成桌面背景

AppleTV 聚焦图像边框不缩放

Winform Enter键实现Tab键聚焦

聚焦时向输入添加类,不聚焦时将其删除

聚焦索引和非聚焦索引的区别