如何以编程方式关闭Safari App Extension popover?

时间:2017-05-15 22:23:21

标签: swift xcode macos popover safari-app-extension

我在Safari App Extension Programming Guide之后使用XCode 8.3和Swift 3构建Safari App扩展。该扩展程序包含popover,在单击扩展程序的工具栏项时会显示该docs。弹出窗口视图包含一些链接到用户可以执行的操作的按钮。

我想点击其中一个按钮,在执行动作后关闭弹出窗口。默认情况下,点击弹出式窗口外的任何位置都可以关闭它,但我无法在指南或NSPopover中找到任何其他方式来关闭弹出窗口。

我知道SFSafariExtensionViewControllerperformClose方法,但似乎并不是从扩展程序中访问popover本身的方法:app扩展程序只允许您提供this StackOverflow answer,其内容神奇地出现在popover中。

我也尝试使用related question中描述的dismissViewController,但在我的视图中,控制器self.presenting总是为零,而self.dismissViewController(self)只会使扩展程序崩溃消息:

dismissViewController:: Error: maybe this view controller was not presented?

最后,我注意到{{3}}以编程方式打开工具栏项目popover在过去6个月内没有得到答复。这让我怀疑苹果可能只是严格限制弹出窗口的打开和关闭方式。即使是这种情况,也很高兴知道这些限制是什么。

2 个答案:

答案 0 :(得分:1)

我会添加一个答案,以防有人偶然发现此问题。

已将dissmissPopover()实例方法添加到SFSafariExtensionViewController类。可用于以编程方式关闭弹出窗口。

在XCode中创建Safari应用程序扩展时提供的默认模板为您提供了一个SafariExtensionViewController类,该类扩展了SFSafariExtensionViewController并将共享实例作为名为“ shared”的静态字段保存,因此您可以从该实例调用dismissPopover()方法。

例如:

class SafariExtensionHandler: SFSafariExtensionHandler {
    func myFunc() {
        // do stuff;

        SafariExtensionViewController.shared.dismissPopover()

        // do other stuff;
    }
}

答案 1 :(得分:0)

我通过调用如下的dismiss方法做到了

@IBAction func onLoginBtnClicked (_ sender: Any) {
    NSLog("Button clicked")
    self.dismiss(self)
}