如何以编程方式打开 Safari 扩展工具栏项目弹出框

问题描述 投票:0回答:3

我想以编程方式触发我的 Safari 扩展工具栏项目上的“单击”事件,以便在网页上发生某些情况后出现我的自定义弹出窗口。我正在使用新的 Xcode 扩展 IDE,并使用界面生成器构建了我的弹出窗口。目前,StackOverflow 上的所有答案都涉及 Safari 扩展构建器中构建的扩展,而不是 Xcode 界面中的扩展。例如,我尝试过注入 Safari JS 解决方案,例如:

safari.extension.toolbarItems[0].showPopover();

但是什么也没有发生,而且我认为当你在 Xcode 中构建扩展时它不应该工作。我不关心弹出窗口是在注入的 javascript 还是在我的 SafariExtensionHandler.Swift 文件中触发 - 我只需要一种无需用户单击工具栏项即可显示它的方法。

我使用扩展程序的 info.plist 将弹出窗口与工具栏项关联起来,我已将其链接到下面:

https://i.sstatic.net/VxyLs.png

该扩展与本机 CocoaOS 应用程序捆绑在一起,并使用 WWDC '15 上引入的新 Xcode 范例构建(链接如下)。我可以使用以下方法访问 SafariExtensionHandler.Swift 中的 Toolbaritem:

 func getToolbarItem(completionHandler: @escaping (SFSafariToolbarItem?) -> Void) {
    SFSafariApplication.getActiveWindow {$0?.getToolbarItem (completionHandler: completionHandler)}
}

但是toolbarItem对象似乎没有显示popover的方法。

https://developer.apple.com/videos/play/wwdc2016/214/

swift xcode cocoa safari-extension
3个回答
7
投票
SFSafariApplication.getActiveWindow { (window) in
    window?.getToolbarItem(completionHandler: { (item) in
        item?.showPopover()
    })
}

3
投票

打开 Safari 扩展程序的

Info.plist
并找到
SFSafariToolbarItem
键,然后查找
Action
子键并确保将其设置为
Popover

此外,请确保您的

SFSafariExtensionViewController
子类分配所需的
preferredContentSize

import SafariServices

class SafariExtensionViewController: SFSafariExtensionViewController {

    static let shared = SafariExtensionViewController()

    override func viewDidLoad() {
        super.viewDidLoad()

        preferredContentSize = NSSize(width: 330, height: 119)
    }

}

0
投票

以下示例显示了 modes 事件的工作原理:

class SafariExtensionHandler: SFSafariExtensionHandler {

    override func toolbarItemClicked(in window: SFSafariWindow) {
        // when: info.plist → SFSafariToolbarItem → Action = Command
    }

    override func popoverWillShow(in window: SFSafariWindow) {
        // when: info.plist → SFSafariToolbarItem → Action = Popover
    }

    override func popoverViewController() -> SFSafariExtensionViewController {
        // when: info.plist → SFSafariToolbarItem → Action = Popover
        return SafariExtensionViewController.shared
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.