0

我想在 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(_ :) 已弃用

我误解了什么?

4

1 回答 1

0

我认为您没有正确设置插座,请确认。还要检查您设置可重用标识符吗?标识符。对我来说,在那之后所有代表都毫无问题地打电话。

IBOUTLET 设置

于 2020-01-10T03:42:08.743 回答