12

我正在按照Safari App Extension Programming Guide使用 XCode 8.3 和 Swift 3 构建一个 Safari App Extension 。该扩展包含一个弹出框,当单击该扩展的工具栏项时会出现该弹出框。弹出视图包含一些链接到用户可以执行的操作的按钮。

我想在执行操作后单击其中一个按钮来关闭弹出框。默认情况下,单击弹出框外的任何位置都会将其关闭,但我无法在指南或文档中找到任何其他方式来关闭弹出框。

我知道NSPopover有一个performClose方法,但似乎没有办法从扩展中访问弹出框本身:应用程序扩展只允许您提供一个SFSafariExtensionViewController,其内容神奇地出现在弹出框中。

我也尝试过按照StackOverflow answerdismissViewController中的描述使用,但在我的视图中控制器始终为零,并且只是使扩展程序崩溃并显示以下消息:self.presentingself.dismissViewController(self)

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

最后,我注意到一个关于以编程方式打开工具栏项弹出框的相关问题在过去 6 个月中没有得到解答。这让我怀疑苹果可能只是对如何打开和关闭弹出框有严格的限制。即使是这种情况,也很高兴确切地知道限制是什么。

4

2 回答 2

2

如果有人偶然发现这个问题,我会添加一个答案。

SFSafariExtensionViewController 类中添加了 dissmissPopover() 实例方法。这可用于以编程方式关闭弹出框。

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

例如:

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

        SafariExtensionViewController.shared.dismissPopover()

        // do other stuff;
    }
}
于 2019-06-05T16:09:04.813 回答
0

我通过调用如下的dismiss方法来做到这一点

@IBAction func onLoginBtnClicked (_ sender: Any) {
    NSLog("Button clicked")
    self.dismiss(self)
}
于 2019-01-17T04:23:43.240 回答