NSPopover失去了第一响应者

时间:2015-12-08 16:38:31

标签: objective-c swift macos cocoa

我的应用程序中有一个NSPopover,带有各种按钮。一个按钮允许用户使用NSSharingService

发推文
NSArray* array = @[ @"Tweet something"];
NSSharingService* sharingServiceFB = [NSSharingService  sharingServiceNamed:NSSharingServiceNamePostOnTwitter];
    [sharingServiceFB performWithItems:array];

这很有效,但是当发送或取消推文时,焦点将返回主应用程序(主窗口),而不是NSPopover。如何将焦点返回到NSPopover

我最初的做法是观察NSWindowDidBecomeKeyNotification,当收到通知并执行以下操作时调用方法

if (self.sheetPopover!=nil){
    [self.sheetPopover becomeFirstResponder];
}

然而,这并没有按预期工作,我仍然需要在NSPopover点击两次才能重新获得焦点。有关如何解决此问题的任何建议?感谢。

1 个答案:

答案 0 :(得分:0)

我找到了一个适合我的解决方案。我让NSPopover成为NSSharingServiceDelegate的委托,并实现了两个委托方法,当twitter视图关闭时我重置了第一个响应者。在这里,self是NSPopover视图。

- (void)sharingService:(NSSharingService *)sharingService didShareItems:(NSArray *)items
{
    [self becomeFirstResponder];
    [[self window] becomeKeyWindow];
    [[self window] becomeMainWindow];    

}

- (void)sharingService:(NSSharingService *)sharingService didFailToShareItems:(nonnull NSArray *)items error:(nonnull NSError *)error
{
   [self becomeFirstResponder];
   [[self window] becomeKeyWindow];
   [[self window] becomeMainWindow];
}

非常欢迎评论这是否是最佳方法。