在焦点上选择NSTextField的文本

Mic*_*l C 11 cocoa select focus nstextfield

任何人都可以建议一种方法来选择NSTextField用户点击它的所有文本吗?

我确实找到了子类的建议NSTextField,然后使用mouseDown或者firstResponder``但是现在它超出了我的技能.所以我希望有一个更简单的解决方案,或者有人可能会详细说明所需的步骤.

Rob*_*ger 23

没有更简单的解决方案,您需要子类NSTextField来执行您想要的操作.如果要在Cocoa中执行任何有用的操作,您将需要学习如何处理子类.

文本字段对于子类来说可能相对复杂,因为它NSTextField使用NSTextView称为"字段编辑器" 的单独对象来处理实际编辑.该文本视图由NSWindow对象返回,NSTextField并重新用于页面上的所有文本字段.

像任何子NSResponder类一样,NSTextField响应方法-acceptsFirstResponder-becomeFirstResponder.当窗口想要将焦点放在特定控件或视图上时,会调用它们.如果YES从这两种方法返回,那么您的控件/视图将具有第一响应者状态,这意味着它是主动控件.但是,如上所述,NSTextField实际上在单击时为字段编辑器提供了第一个响应者状态,因此您需要在NSTextField子类中执行以下操作:

@implementation MCTextField
- (BOOL)becomeFirstResponder
{
    BOOL result = [super becomeFirstResponder];
    if(result)
        [self performSelector:@selector(selectText:) withObject:self afterDelay:0];
    return result;
}
@end
Run Code Online (Sandbox Code Playgroud)

这首先调用超类的实现-becomeFirstResponder,它将完成管理字段编辑器的艰苦工作.然后调用-selectText:它选择字段中的所有文本,但是在延迟0秒之后它会这样做,这将延迟到下一次运行事件循环.这意味着在完全配置字段编辑器后将进行选择.


bha*_*ler 5

@Rob的答案可能在某一点上起作用,但正如@Daniel指出的那样,它不再起作用了.看起来Cocoa想要跟踪鼠标并拖出一个选择以响应点击,并且尝试选择响应的文本becomeFirstResponder并不能很好地发挥作用.

然后,需要拦截鼠标事件,以防止跟踪.或多或少通过反复试验,我找到了一个似乎适用于OS X 10.10的解决方案:

@interface MyAutoselectTextField : NSTextField
@end

@implementation MyAutoselectTextField
- (void)mouseDown:(NSEvent *)theEvent
{
    [[self currentEditor] selectAll:nil];
}
@end
Run Code Online (Sandbox Code Playgroud)

据我所知,mouseDown:在调用时已经建立了字段编辑器,可能是作为副作用becomeFirstResponder.selectAll:然后调用选择字段编辑器的内容.调用selectText:self,而不是不顺利,大概是因为字段编辑器设置.请注意,mouseDown:此处的覆盖不会调用super; super会运行一个跟踪循环来拖出一个选择,我们不希望这种行为.请注意,mouseDown:一旦文本字段成为第一响应者,此覆盖不会影响选择,因为此时它mouseDown:是正在调用的字段编辑器.

我不知道这个OS X版本的范围是多少; 如果你关心,你需要测试它.不幸的是,使用NSTextField它总是有点脆弱,因为字段编辑器的工作方式是如此奇怪,因此依赖于实现细节super.