Всплывающее окно расширения приложения Safari не вызывает методы уведомления представления таблицы - PullRequest
0 голосов
/ 10 января 2020

Я хочу включить 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 (_ :) устарела

И я что-то недопонимаю?

1 Ответ

0 голосов
/ 10 января 2020

Я думаю, что вы не настраиваете розетку должным образом, пожалуйста, подтвердите это. Также проверьте, настраиваете ли вы повторно используемый идентификатор? идентификатор. для меня все делегаты звонят без проблем после этого.

IBOUTLET Setting

...