我想在 Safari 应用程序扩展的弹出窗口中包含一个基于视图的 NSTableView。
从 Xcode 中的默认项目开始,我将 SFSafariExtensionViewController 设置为表格视图的委托和数据源,因为它是弹出框上的唯一内容,而且大多数情况下都可以。
我可以填充表并实现类似的tableView(_:shouldSelectRow:)
方法,但返回通知对象的方法(例如tableViewSelectionDidChange(_:)
不被调用)。
虽然这些方法显示了一种知道何时选择行的笨拙方式,但我无法知道何时编辑单元格。
由于我必须将 NSTableView 的委托插座连接到文件所有者以允许委托方法工作,我也尝试连接 dataSource 插座,但这确实没有帮助。
这是我的代码的本质(现在包括返回虚拟表数据以进行测试编辑):
class SafariExtensionViewController: SFSafariExtensionViewController {
@IBOutlet weak var tableView: NSTableView!
static let shared: SafariExtensionViewController = {
let shared = SafariExtensionViewController()
shared.preferredContentSize = NSSize(width:445, height:421)
return shared
}()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
func textDidEndEditing(_ notification: Notification) {
NSLog("I will NEVER appear in the console")
}
}
extension SafariExtensionViewController: NSTableViewDataSource {
func numberOfRows(in tableView: NSTableView) -> Int {
return 5
}
}
extension SafariExtensionViewController: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let cellView = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView
cellView?.textField?.stringValue = "Blah"
return cellView
}
func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
NSLog("I will appear in the console")
return true
}
func tableViewSelectionDidChange(_ notification: Notification) {
NSLog("I will NEVER appear in the console")
}
func controlTextDidEndEditing(_ obj: Notification) {
NSLog("I will NEVER appear in the console")
}
}
(显然我不需要两者textDidEndEditing(_:)
,controlTextDidEndEditing(_:)
但我只是在尝试一切。)
我猜这个问题与没有为 SFSafariExtensionViewController 中的通知注册的表格视图有关?不过,该对象继承自 NSViewController,所以我认为这些方法应该自动工作。
这是我第一次使用 swift,已经很久没有写过 Mac 应用了。但是扩展的实际功能是有效的,现在我只想拥有通过 UI 自定义设置的能力。
然而,关于 Safari 应用程序扩展编程的文章似乎很少,Apple 的文档很少,我什至无法找到任何具有弹出窗口中的表格视图的代码示例来学习。
我可能遗漏了一些非常明显的东西,但是我已经用完了在这里和整个网络上尝试的搜索,所以任何帮助都将不胜感激。
更新:
我想我有一个答案,通过将表中的 NSTextFields 显式链接到作为委托的文件所有者,tableViewSelectionDidChange(_:)
andcontrolTextDidEndEditing(_:)
方法现在正在工作。肯定有其他问题导致前者无法工作,我不小心打破并修复了,但这对后者来说是有道理的。
这就是我需要的功能才能工作,但是我仍然很困惑为什么textDidEndEditing(_:)
当我被领导认为它应该工作时仍然无法工作。
在 Apple 的文档中,textDidEndEditing(_ :) 是 NSTextField 的一种方法,它链接到一个页面说controlTextDidEndEditing(_ :) 已弃用
我误解了什么?