【问题标题】:Default textField in a status item状态项中的默认文本字段
【发布时间】:2011-07-11 01:53:21
【问题描述】:

我在状态项中有一个文本字段,希望在单击状态项时立即激活它。我在applicationDidFinishLaunching 中尝试了通常的becomeFirstResponder,然后在awakeFromNib 中尝试了,但它没有用。我想这是因为在启动时调用这些方法时状态项的菜单未打开,可能会忽略它。然后我尝试在单击状态项时设置一个操作,但是这里有人告诉我,只有在状态项没有下拉菜单时才能执行这些操作,而我的就是这样。我想要的是单击状态项,并显示下拉菜单并激活文本字段,以便可以立即开始输入。我正在使用自定义视图在菜单中显示文本字段,不确定这是否相关但在这种情况下可能应该使用其他东西?

谢谢。

【问题讨论】:

    标签: objective-c cocoa statusbar


    【解决方案1】:

    您可以将一个对象设置为状态项菜单的delegate,实现‑menuWillOpen: 委托方法,然后使用‑performSelector:withObject:afterDelay:modes: 设置第一响应者。

    这将确保使文本字段成为第一响应者的调用在菜单打开后的下一次通过事件循环的运行中发生。你需要在传递给modes:参数的运行循环模式数组中传入NSRunLoopCommonModesNSEventTrackingRunLoopMode,因为普通的performSelector:withObject:afterDelay:方法在菜单关闭之前不会调用选择器。

    - (void)menuWillOpen:(NSMenu *)menu
    {
        [self performSelector:@selector(highlightField) withObject:nil afterDelay:0.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
    }
    
    - (void)highlightField
    {
        [[yourTextField window] makeFirstResponder:yourTextField];
    }
    

    【讨论】:

    • 当我点击状态项时至少有一个动作要执行,但是 [[yourTextField window] makeFirstResponder:yourTextField];没用。我让这个方法在文本字段中放了一个 5 以查看它是否正常工作,当它打开时什么也没发生,但是当我关闭它并再次打开它时,5 就在那里。它似乎几乎像 menuDidClose 一样工作。不知道发生了什么...
    • 对不起,我应该改用‑performSelector:withObject:delay:modes 方法。如果您希望在菜单跟踪期间发生方法调用,则需要在 NSRunLoopCommonModes 运行循环模式中安排方法调用。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2020-07-27
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    相关资源
    最近更新 更多