具体来说,它在文本字段焦点方面的行为不一致。
我有一个LSUIElement弹出状态菜单。在该菜单中,有一个包含文本字段的视图。文本字段必须是可选的-默认情况下不一定是选中的,而是任意一个。
单击状态项时,它将触发
[NSApp activateIgnoringOtherApps:YES];
而且它的工作时间大约是一半。*状态菜单的另一半似乎认为自己是“后台”,即使单击也不会让我专注于文本字段。 (我知道状态项目的Click-trigger正在触发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];
}
最佳答案
最终提出了解决方法。
激活应用程序,然后安排一个不带延迟的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:
而言,其足够长的时间可导致在同一帧中弹出菜单时阻止其正常工作。