[英]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(_ :) 已棄用
我誤會了什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.