我想以编程方式触发我的 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的方法。
SFSafariApplication.getActiveWindow { (window) in
window?.getToolbarItem(completionHandler: { (item) in
item?.showPopover()
})
}
打开 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)
}
}
以下示例显示了 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
}
}