NSTextField获得焦点,但没有文本输入光标可见

时间:2016-08-25 12:19:48

标签: objective-c macos cocoa cursor nstextfield

在我的情况下,NSTextField没有按预期工作。我得到的是:

  • 视图上的NSTextField控件,显示在窗口中,不是主应用程序窗口。

  • 此文本字段最初不可见 - 当选择“编辑主题”菜单项时,它会放置在动画高度的视图上(自定义弹出菜单)

  • 此动画视图还有其他控件 - 两个按钮:一个删除文本字段中的文本,另一个是“完成”

  • 该窗口还有一个自定义的NSText控件,主要关注(聊天的文本输入控件)

  • 聊天窗口(我正在处理的窗口)还有一个对话列表。

我正在做的步骤:

  • 当我右键点击对话(从列表中)时,会显示弹出菜单。
  • 我选择编辑主题菜单项
  • 使用NSTextField扩展视图,NSTextField应该激活,我希望在此NSTextField中激活闪烁的光标

但是没有光标闪烁。当我开始输入时,我可以编辑和光标显示,所以我认为,文本字段具有焦点。我需要在视图扩展后立即让光标闪烁。

要为此“编辑主题”视图的高度设置动画,我使用NSAnimationContext runAnimationGroup,在完成处理程序中,我在NSTextField的窗口上调用makeFirstResponder,并将NSTextField作为第一响应者。

我尝试了运行makeFirstResponder的不同组合:在开始动画之前,在动画的完成处理程序中,尝试了performSelector的不同变体:在主线程上调用,使用dispatch_async,dispatch_after,甚至是performClick :(但是这个收缩动画容器视图为0,因为外面的任何点击都会关闭它)。效果总是一样的:关注NSTextField - 我可以输入这个文本字段,但最初没有键盘输入光标。

编辑完成后,NSText上的makeFirstResponder即聊天文本输入窗口光标显示正确。

我在那里错过了什么?为什么文本字段在没有光标的情什么可以防止第一响应者的NSTextField不显示游标?我几乎完全确定我之后在应用程序的任何地方都没有做任何其他控制第一响应者。请帮忙。

2 个答案:

答案 0 :(得分:2)

经过几个小时的实验和互联网浏览寻找解决方案后,我发现这个非常有用的黑客:

https://gist.github.com/Kapeli/7abd83d966957c17a827

- (void)ensureCursorBlink 
{
    if(isYosemite && !self.stringValue.length)
    {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        if(!self.stringValue.length)
        {
            [self setStringValue:@" "];
            [self setStringValue:@""];
        }
        });
   }
}

并在makeFirstResponder之后调用它: 实际上,即使没有dispatch_after,它也适用于我。

答案 1 :(得分:0)

尝试了几天后对我有效:

[textField selectText:nil];

查看此线程:http://cocoadev.github.io/MakingNSTextFieldActive/