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

谢谢。

最佳答案

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

这将确保在打开菜单之后,在事件循环的下一次运行中,使文本字段成为第一响应者的调用发生在下一次运行中。您需要在传递给NSRunLoopCommonModes参数的运行循环模式数组中传递NSEventTrackingRunLoopModemodes:,因为普通的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];
}

关于objective-c - 状态项中的默认textField,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6645049/

10-11 21:38