我在状态项中有一个文本字段,并希望在单击状态项时立即将其激活。我在becomeFirstResponder
中尝试了通常的applicationDidFinishLaunching
,然后在awakeFromNib
中尝试了,但是没有用。我想象t是因为在启动时调用那些方法时状态项目的菜单未打开,可能会忽略它。然后,我试图在单击状态项时设置一个动作,但是这里有人告诉我,只有当状态项没有下拉菜单时,才能执行这些动作。我想要的是单击状态项,并在文本字段被激活的情况下显示下拉菜单,以便可以立即开始键入。我正在使用自定义视图在菜单中显示文本字段,不确定是否相关,但是在这种情况下也许应该使用其他方法?
谢谢。
最佳答案
您可以将一个对象设置为状态项目菜单的delegate
,实现‑menuWillOpen:
委托方法,然后使用‑performSelector:withObject:afterDelay:modes:
设置第一个响应者。
这将确保在打开菜单之后,在事件循环的下一次运行中,使文本字段成为第一响应者的调用发生在下一次运行中。您需要在传递给NSRunLoopCommonModes
参数的运行循环模式数组中传递NSEventTrackingRunLoopMode
或modes:
,因为普通的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/