簡體   English   中英

Safari 應用程序擴展彈出窗口不調用表視圖通知方法

[英]Safari app extension popover not calling table view notification methods

我想在 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(_:)controlTextDidEndEditing(_:)方法現在正在工作。 肯定有其他錯誤導致前者無法正常工作,我不小心破壞並修復了它,但對后者來說是有道理的。

這就是功能正常工作所需的全部內容,但是我仍然困惑為什么textDidEndEditing(_:)在我被引導相信它應該工作時仍然不起作用。

在 Apple 的文檔中, textDidEndEditing(_ :) 是 NSTextField 的一種方法,它鏈接到一個頁面,說controlTextDidEndEditing(_ :) 已棄用

我誤會了什么?

我認為您沒有正確設置插座,請確認這一點。 還要檢查您是否設置了可重用標識符? 標識符。 對我來說,之后所有委托調用都沒有問題。

IBOUTLET設置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM