[英]SwiftUI: NSPageController in NSViewControllerRepresentable crashes
[英]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)。
我首先要做的就是獲取一個包含NSTableView
的NSViewController
,每當用戶在 NSTableView 中選擇新行時,通過Coordinator
將NSTableView.selectedRow
傳遞到其父 SwiftUI 視圖中。 任何人都可以幫忙(如果可能的話,請提供一些示例代碼)?
我似乎找到了解決我自己問題的方法。 我一直在將我的NSTableViewDelegate
分配給makeNSViewController
function 中的協調器。 但是,在填充我的NSTableView
的NSTableViewDataSource
內容的代碼運行(在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.