SwiftUI:NSViewControllerRepresentable 中的 NSPageController 崩溃

SwiftUI: NSPageController in NSViewControllerRepresentable crashes

我正在尝试以编程方式将 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)
    }
    
}

到目前为止,我尝试创建在 NSPageController 上调用 super.init(nibName: nil, bundle: nil) 的自定义初始化程序,但这也没有用。我也试过覆盖'loadView',但我还是没成功。

我确实发现应用程序在 makeNSViewController 调用中的 NSPageControllerloadView 调用中崩溃。

默认情况下,NSViewControllers 的便捷初始化程序会尝试从 nib 加载它们的视图。

您需要覆盖 loadView 并实际向页面控制器提供视图

override func loadView() {
        self.view = NSView() // the view being controlled
}