Использование координатора SwiftUI с NSTableView в NSViewControllerRepresentable?

Я разработал приложение для личных финансов macOS в SwiftUI, которое использует NSTableViews и NSOutlineViews через NSViewControllerRepresentable интерфейс между SwiftUI и AppKit.

Я обнаружил, что возможности просмотра AppKit намного превосходят все, что я могу создать с помощью списков SwiftUI, плюс они работают быстрее и поддерживают TypeSelect. Передача данных в Appkit ViewControllers проста, но получение информации кажется менее трудным.

В документации для разработчиков Apple предлагается использовать класс, и я пытался это сделать, но безуспешно. Нужный мне делегированный метод ( func tableViewSelectionDidChange(_ notification: Notification)) не запускается (из моего класса).

На данный момент я обмениваюсь данными и действиями, используя NotificationCenter.defaultи это работает хорошо, но я очень хочу использовать «официальный» метод. Я нашел приложение для macOS, которое успешно использует Координатор ( https://www.markusbodner.com/til/2021/02/08/multi-line-text-field-with-swiftui-on-macos/), но я не могу заставить мой класс работать в качестве NSTableViewDelegate даже если он строится и работает без ошибок (Xcode 12.4).

Все, что я хочу сделать для начала, это получить NSViewController который содержит NSTableView передать NSTableView.selectedRow в свое родительское представление SwiftUI через Coordinator, всякий раз, когда пользователь выбирает новую строку в NSTableView. Может ли кто-нибудь помочь (с примером кода, если возможно, пожалуйста)?

1 ответ

Кажется, я нашел решение своей проблемы. Я отдавал свои деньги Координатору в makeNSViewControllerфункция. Однако похоже, что экземпляр my не создается до тех пор, пока код, который заполняет содержимое my , не будет запущен (в функции). В результате нечего выделять.

Движущийся tableVC.tableView?.delegate = context.coordinatorв updateNSViewControllerфункция, следуя коду, который заполняет содержимое моего NSTableViewDataSource, делает мой NSTableViewDelegateработать по назначению и tableView.selectedRowзначения теперь передаются моему родительскому представлению SwiftUI через func tableViewSelectionDidChange(_ notification: Notification)успешно. Ура!

Может быть полезно отметить, что я использую привязки Cocoa в своих NSTableViewи обнаружили, что нужно оставить пустым @IBAction funcзаглушки (с помощью Ctrl перетащите из Interface Builder, как обычно) в ViewController (владелец файла) и поместите копии этих функций (конечно, заполненные кодом) в моем классе Coordinator, чтобы их код выполнялся, как предполагалось.

Полученный общий код намного аккуратнее, чем мой старый код, который использовал уведомления для передачи действий и данных между SwiftUI и AppKit, поэтому «официальный» метод выглядит лучшим.

Другие вопросы по тегам