swift - 在 Safari 12 Extension Popover 中访问当前页面信息
问题描述
我试图让活动选项卡的页面信息显示在弹出窗口中。我可以让它显示当前页面的 URL 或标题,但它需要打开和关闭扩展弹出框两次。
我相信这是因为要获取该信息,下面的代码依赖于completionHandler
使其异步。
SFSafariApplication.getActiveWindow { (window) in
window?.getActiveTab { (tab) in
tab?.getActivePage(completionHandler: { (page) in
page?.getPropertiesWithCompletionHandler( { (properties) in
self.pageTitle = properties?.title ?? "Unknown"
self.ActivePageTitle.stringValue = self.pageTitle
})
})
}
}
第一次打开弹出框时,它会显示一个空白文本区域,但第二次它会在之前加载信息并正确显示。
我试过运行它,viewDidLoad()
但它只会在第一次打开弹出窗口时触发。
在运行它时,viewWillAppear()
我收到以下错误:
pid(17738)/euid(501) is calling TIS/TSM in non-main thread environment,
ERROR : This is NOT allowed. Please call TIS/TSM in main thread!!!
我认为也许将扩展名切换为使用 acommand
会起作用,但后来意识到您无法以编程方式打开弹出窗口。
一旦数据的异步请求完成,我是否必须切换到UITableView
或具有运行功能的东西?reloadData()
macOS 10.14.4 | Safari 12.1 | Xcode 10.2
解决方案
尝试在主线程上更新您的 UI 代码。将页面标题更新包装在 DispatchQueue 中。我遇到了几乎完全相同的问题,这对我有用。
SFSafariApplication.getActiveWindow { (window) in
window?.getActiveTab { (tab) in
tab?.getActivePage(completionHandler: { (page) in
page?.getPropertiesWithCompletionHandler( { (properties) in
DispatchQueue.main.async {
self.pageTitle = properties?.title ?? "Unknown"
self.ActivePageTitle.stringValue = self.pageTitle
}
})
})
}
}
为了给予适当的信任,我在 GitHub 上挖掘这段代码时找到了答案(查看updateDataLabels()
方法):
https ://github.com/otzbergnet/tabCount/blob/master/tabCount%20Extension/SafariExtensionViewController.swift
推荐阅读
- magento - Magento 1.9 POA 显示在购物车中,但不在订单审查/发票中
- spring - Spring batch - 具有多个页眉和页脚的文件读取器和写入器(ACH 格式)
- ios - 为什么我的视频没有显示在我使用 AVPlayer 的滚动视图的单元格中
- angular - 在 Spring Boot 应用程序中迁移 JSP 以使用 Angular
- version - 在 ubuntu 终端中运行时的 Python 版本
- javascript - 无法解决这个因for循环出错的阶乘问题
- ruby-on-rails - 如何在 Rails 中基于多个模型做出决策?
- debugging - ASP.NET Core 3.1 调试内置管道
- ruby-on-rails - 将 rails 5.0 升级到 rails 6.0.1 - 现有应用程序
- mysql - 在 SQL 中加入 3 个表时出现重复条目