问题描述
我试图以编程方式将 NSPageController
放入 SwiftUI NSViewControllerRepresentable
,但是当应用程序运行时,它崩溃并显示以下错误:
-[NSNib _initWithNibNamed:bundle:options:] Could not load the nibName: test.PageController in bundle (null).
这是我能想到的用于演示问题的最小示例:
页面浏览:
struct PageView: NSViewControllerRepresentable {
let data = ["green","blue","red"]
typealias NSViewControllerType = PageController
func makeNSViewController(context: Context) -> PageController {
let pageController = PageController()
pageController.arrangedobjects = data
pageController.delegate = pageController
return pageController
}
func updateNSViewController(_ nsViewController: PageController,context: Context) {
}
}
页面控制器:
class PageController: NSPageController,NSPageControllerDelegate {
func pageController(_ pageController: NSPageController,identifierFor object: Any) -> NSPageController.ObjectIdentifier {
return (object as? String) ?? "green"
}
func pageController(_ pageController: NSPageController,viewControllerForIdentifier identifier: NSPageController.ObjectIdentifier) -> NSViewController {
let rootView: Color
switch identifier {
case "green":
rootView = .green
case "red":
rootView = .red
default:
rootView = .blue
}
return NSHostingController(rootView: rootView)
}
}
到目前为止,我尝试创建在 super.init(nibName: nil,bundle: nil)
上调用 NSPageController
的自定义初始化程序,但这也不起作用。我也试过覆盖“loadView”,但我仍然没有让它工作。
我确实发现应用程序在 loadView
调用中的 NSPageController
调用中崩溃。
解决方法
NSViewControllers 的便利初始化器默认尝试从 nib 加载它们的视图。
您需要覆盖 loadView 并实际为页面控制器提供一个视图
override func loadView() {
self.view = NSView() // the view being controlled
}