Я хочу включить NSTableView на основе представления во всплывающее окно Расширения приложения Safari.
Начиная с проекта по умолчанию в 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, и я давно писал приложение для Ma c. Но реальная функциональность расширения работает, теперь я просто хочу иметь возможность настраивать параметры через пользовательский интерфейс.
Однако, похоже, очень мало написано о программировании расширений приложений Safari, документация Apple немногочисленна, и я даже не смог найти примеров кода с табличным представлением в поповере, чтобы поучиться у него.
Возможно, мне не хватает чего-то очень очевидного, но у меня закончились поиски, чтобы примерить здесь, и в целом, поэтому любая помощь будет оценена.
ОБНОВЛЕНИЕ:
Я думаю, что у меня есть ответ, явно связав поля NSTextFields в таблице с владельцем файла в качестве делегата, * Методы 1030 * и controlTextDidEndEditing(_:)
теперь работают. Должно быть, было что-то еще не так, что первый не работал, который я случайно сломал и исправил, но для второго это имеет некоторый смысл.
Это все, что мне нужно, чтобы функционал работал, однако я все еще работаю сбит с толку, почему textDidEndEditing(_:)
все еще не работает, когда меня ведут, считают, что это должно.
И в документации Apple, textDidEndEditing (_ :) - это метод NSTextField , который ссылается на страница с надписью controlTextDidEndEditing (_ :) устарела
И я что-то недопонимаю?