首页 > 解决方案 > SwiftUI:NSViewControllerRepresentable 中的 NSPageController 崩溃

问题描述

我试图以编程方式将 aNSPageController放入 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)on 的自定义初始化程序NSPageController,但这也不起作用。我也尝试过覆盖'loadView',但我仍然没有让它工作。

我确实发现应用程序在loadView调用NSPageController内部调用时崩溃了makeNSViewController

标签: swiftmacosswiftuiappkit

解决方案


NSViewControllers 的便利初始化器默认尝试从 nib 加载它们的视图。

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

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

推荐阅读