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