Im' एक SwiftUI NSViewControllerRepresentable में प्रोग्रामेटिक रूप से NSPageController डालने की कोशिश कर रहा है, लेकिन जब ऐप चलता है, तो यह निम्न त्रुटि के साथ क्रैश हो जाता है:

 -[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 पर कॉल करते हैं, लेकिन वह भी काम नहीं किया। मैंने 'लोड व्यू' को ओवरराइट करने का भी प्रयास किया, लेकिन मुझे अभी भी यह काम नहीं मिला।

मैंने पाया कि makeNSViewController कॉल के अंदर NSPageController के loadView कॉल में ऐप क्रैश हो जाता है।

1
Blasmo 11 जिंदा 2021, 17:59

1 उत्तर

सबसे बढ़िया उत्तर

डिफ़ॉल्ट रूप से NSViewControllers के लिए सुविधा प्रारंभकर्ता अपने विचारों को निब से लोड करने का प्रयास करते हैं।

आपको लोड व्यू को ओवरराइड करने और वास्तव में पेज कंट्रोलर को एक दृश्य प्रदान करने की आवश्यकता है

override func loadView() {
        self.view = NSView() // the view being controlled
}
2
JuJoDi 11 जिंदा 2021, 21:05