簡體   English   中英

如何以編程方式關閉Safari App Extension popover?

[英]How can I close a Safari App Extension popover programmatically?

我正在使用XCode 8.3和Swift 3構建Safari App擴展,遵循Safari App Extension編程指南 擴展程序包括單擊擴展程序工具欄項時顯示的彈出窗口。 彈出窗口視圖包含一些鏈接到用戶可以執行的操作的按鈕。

我想在執行操作后單擊其中一個按鈕來關閉彈出窗口。 默認情況下,單擊彈出窗口外的任何位置會關閉它,但我無法在指南或文檔中找到任何其他方法來關閉彈出窗口。

我知道NSPopover有一個performClose方法,但似乎沒有辦法從擴展中訪問popover本身:app擴展只允許你提供一個SFSafariExtensionViewController ,其內容神奇地出現在popover中

我也試過使用這個StackOverflow答案中描述的dismissViewController ,但是在我的視圖中,控制器self.presenting總是為nil,而self.dismissViewController(self)只是使用消息崩潰擴展:

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

最后,我注意到一個相關的問題,關於以編程方式打開工具欄項目popover在過去的6個月里沒有得到答復。 這讓我懷疑蘋果可能只是嚴格限制彈出窗口的打開和關閉方式。 即使是這種情況,也很高興知道這些限制是什么。

我會添加一個答案,以防任何人偶然發現這個問題。

已將一個dissmissPopover()實例方法添加到SFSafariExtensionViewController類中。 這可用於以編程方式關閉popover。

在XCode中創建Safari App Extension時給出的默認模板為您提供了一個SafariExtensionViewController類,該類擴展了SFSafariExtensionViewController並將共享實例保存為名為“shared”的靜態字段,因此您可以從該實例調用dismissPopover()方法。

例如:

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

        SafariExtensionViewController.shared.dismissPopover()

        // do other stuff;
    }
}

我通過調用下面的dismiss方法來做到這一點

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM