状态项中的默认textField

时间:2011-07-11 01:53:22

标签: objective-c cocoa statusbar

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

感谢。

1 个答案:

答案 0 :(得分:1)

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