具体来说,它在文本字段焦点方面表现不一致。
我有一个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];
}
答案 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]
}
根据您的说法,听起来您的应用程序启动时间太晚,因此在您第一次点击该项目时它不会被激活,但它已在后续点击时激活。