【问题标题】:How can I close a Safari App Extension popover programmatically?如何以编程方式关闭 Safari 应用程序扩展弹出框?
【发布时间】:2017-10-14 20:12:29
【问题描述】:

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

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

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

我也尝试过使用dismissViewController,如this StackOverflow answer 中所述,但在我的视图控制器中self.presenting 始终为零,self.dismissViewController(self) 只是使扩展程序崩溃并显示消息:

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

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

【问题讨论】:

  • 这个运气好吗?
  • @mohacs 不走运。我们最终让工具栏项在我们的主应用程序中打开了一个窗口。
  • 这很糟糕。可能我会花一张我的开发支持票,并会问苹果工程师。如果我学到了一些东西,我会告诉你的。
  • 根据 bweinstein 在此线程中的回答:forums.developer.apple.com/thread/105817 这目前是不可能的,但他们正在“......为此开发 API,并希望尽快将其用于扩展。”

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


【解决方案1】:

我是通过调用下面的dismiss方法来做到的

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

【讨论】:

    【解决方案2】:

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

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

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

    例如:

    class SafariExtensionHandler: SFSafariExtensionHandler {
        func myFunc() {
            // do stuff;
    
            SafariExtensionViewController.shared.dismissPopover()
    
            // do other stuff;
        }
    }
    

    【讨论】:

    • 但是,您需要在弹出窗口中实例化的第一个 ViewController 实例上调用 dismissPopover 方法(例如,如果您的故事板中有多个视图和 viewController)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多