Использование координатора 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, поэтому «официальный» метод выглядит лучшим.