簡體   English   中英

在 NSViewControllerRepresentable 中使用 SwiftUI 協調器和 NSTableView?

[英]Using SwiftUI Coordinator with NSTableView in NSViewControllerRepresentable?

我在 SwiftUI 中開發了一個 macOS 個人理財應用程序,它通過 SwiftUI 和 AppKit 之間的NSViewControllerRepresentable接口使用 NSTableViews 和 NSOutlineViews。

我發現 AppKit 視圖功能遠遠優於我可以使用 SwiftUI 列表創建的任何東西,而且它們運行得更快並支持 TypeSelect。 將數據傳遞到 Appkit ViewControllers 很簡單,但獲取信息似乎不那么簡單。

Apple 開發人員文檔建議我應該使用Coordinator器 class,我曾嘗試這樣做但無濟於事。 我需要的委托方法( func tableViewSelectionDidChange(_ notification: Notification) )無法運行(從我的Coordinator類內部)。

目前我正在使用NotificationCenter.default交換數據和操作,效果很好,但我熱衷於使用“官方”方法。 我找到了一個成功使用 Coordinator 的 macOS 應用程序(在https://www.markusbodner.com/til/2021/02/08/multi-line-text-field-with-swiftui-on-macos/ )但我不能讓我的Coordinator器 class 作為NSTableViewDelegate工作,即使它構建和運行時沒有錯誤(Xcode 12.4)。

我首先要做的就是獲取一個包含NSTableViewNSViewController ,每當用戶在 NSTableView 中選擇新行時,通過CoordinatorNSTableView.selectedRow傳遞到其父 SwiftUI 視圖中。 任何人都可以幫忙(如果可能的話,請提供一些示例代碼)?

我似乎找到了解決我自己問題的方法。 我一直在將我的NSTableViewDelegate分配給makeNSViewController function 中的協調器。 但是,在填充我的NSTableViewNSTableViewDataSource內容的代碼運行(在updateNSViewController函數中)之前,我的NSTableView似乎沒有被實例化。 因此沒有NSTableViewDelegate可以分配。

tableVC.tableView?.delegate = context.coordinator移動到updateNSViewController function 中,按照填充我的NSTableViewDataSource內容的代碼,使我的NSTableViewDelegate按預期工作,並且tableView.selectedRow值現在傳遞給我的父 Z5D807DF8E2D0F6FCC3B5037BfuncView7 func tableViewSelectionDidChange(_ notification: Notification) ABDidChange8 func tableViewSelectionDidChange(_ notification: Notification)成功。 歡呼!

注意到我在我的NSTableView中使用 Cocoa 綁定可能很有用,並且發現有必要在 ViewController(文件的所有者)中保留空@IBAction func存根(ctrl-draged form Interface Builder as normal)並放置副本我的協調器 class 中的這些函數(當然填充了代碼)中的這些函數,以使其代碼按預期執行。

生成的整體代碼比我的舊代碼簡潔得多,舊代碼使用通知在 SwiftUI 和 AppKit 之間傳遞操作和數據 - 所以“官方”方法看起來是最好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM