LSUIElement与activateIgnoringOtherApps的行为不一致

时间:2009-12-07 03:11:03

标签: cocoa statusbar nsstatusitem

具体来说,它在文本字段焦点方面表现不一致。

我有一个LSUIElement弹出一个状态菜单。在该菜单中,有一个包含文本字段的视图。文本字段需要是可选择的 - 默认情况下不一定要选,但无论如何。

单击状态项时,会触发

[NSApp activateIgnoringOtherApps:YES];

它工作,大约一半时间。*另一半状态菜单似乎“在后台”,并且不会让我把焦点放在文本字段上,即使点击它。 (我知道状态项单击触发器正在触发b / c上有一个NSLog。)

这是Apple处理这些状态项的方式中的错误,还是我错误处理activateIgnoringOtherApps?

*实际上,它似乎仅在第一次激活另一个应用程序后失败。之后它运作正常。

完整代码段:

-(void)statusItemClicked:(id)sender {
    //show the popup menu associated with the status item.
    [statusItem popUpStatusItemMenu:statusMenu];

    //activate *after* showing the popup menu to obtain focus for the text field.
    [NSApp activateIgnoringOtherApps:YES];

}

2 个答案:

答案 0 :(得分:2)

最后想出了一个解决方法。

不是弹出点击处理程序中的菜单,而是激活应用程序,然后安排一个没有延迟的NSTimer弹出菜单:

-(void)pop:(NSTimer *)timer {
    [statusItem popUpStatusItemMenu:theMenu];
}

-(void)statusItemClicked:sender {
    [NSApp activateIgnoringOtherApps:YES];
    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(pop:) userInfo:nil repeats:NO];
}

pop:在下一帧被调用,因此延迟是不可察觉的,但足够长,activateIgnoringOtherApps:可以做任何阻止它在同一帧中弹出菜单时按预期工作的内容。

答案 1 :(得分:0)

我从经验中知道,您必须在之后调用activateIgnoringOtherApps: ,您弹出了包含文本字段的菜单。因此,您需要按此顺序执行此操作:

- (void)statusItemClicked:sender {
    [statusItem popUpStatusItemMenu:theMenu];
    [NSApp activateIgnoringOtherApps:YES]; // FYI, NSApp is shorthand for [NSApplication sharedApplication]
}

根据您的说法,听起来您的应用程序启动时间太晚,因此在您第一次点击该项目时它不会被激活,但它已在后续点击时激活。