我在状态项中有一个文本字段,并且希望在单击状态项时它立即处于活动状态。我在becomeFirstResponder
中尝试了通常的applicationDidFinishLaunching
,然后在awakeFromNib
中尝试了,但它没有用。我想是因为当启动时调用这些方法时,状态项的菜单不会打开,可能会忽略它。然后我尝试在单击状态项时设置操作,但是有人告诉我,只有当状态项没有下拉菜单时才会执行这些操作。我想要的是单击状态项,并显示下拉菜单,文本字段已激活,因此可以立即开始输入。我正在使用自定义视图来显示菜单中的文本字段,不确定这是否相关但是在这种情况下可能会使用其他内容?
感谢。
答案 0 :(得分:1)
您可以将对象设置为状态项菜单的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];
}