目标c -状态项的默认文本字段



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

谢谢。

您可以将对象设置为状态项菜单的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];
}