SwiftUI:NSViewControllerRepresentable 中的 NSPageController 崩溃

问题描述

我试图以编程方式将 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
}