ActivateIgnoringOtherApps

ActivateIgnoringOtherApps

具体来说,它在文本字段焦点方面的行为不一致。

我有一个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:而言,其足够长的时间可导致在同一帧中弹出菜单时阻止其正常工作。

08-05 22:25