自定义UIHostingController报错:未实现init(nibName:bundle:)初始化器
UIHostingController初始化崩溃问题
错误信息
Fatal error: Use of unimplemented initializer 'init(nibName:bundle:)' for class 'SwiftUI.UIHostingController'
相关代码
自定义UIHostingController子类代码
import UIKit import SwiftUI struct SwiftUIView: View { var body: some View { ZStack { Text("annen") .font(.headline) .fontWeight(.bold) } } } class SwiftUIViewController: UIHostingController<SwiftUIView> { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder, rootView: SwiftUIView()) } }
SceneDelegate中的代码
if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) let mainView = HomeView(vm: HomeView.VM(state: self.state)).environmentObject(self.state) window.rootViewController = UIHostingController(rootView: mainView) self.window = window window.makeKeyAndVisible() }
用户疑问
除了这段代码外我没有其他UIHostingController的使用场景,请问这是Bug还是我代码的问题?
问题原因与修复方案
这是代码问题,不是系统Bug。
问题出在自定义的SwiftUIViewController类中:UIViewController的子类如果实现了init?(coder:),系统在某些场景下会尝试调用init(nibName:bundle:)初始化方法,但UIHostingController并没有默认实现这个方法,因此触发了未实现初始化器的致命错误。
修复代码
修改自定义SwiftUIViewController类,补充必要的初始化方法:
class SwiftUIViewController: UIHostingController<SwiftUIView> { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder, rootView: SwiftUIView()) } // 覆盖rootView初始化器 override init(rootView: SwiftUIView) { super.init(rootView: rootView) } // 必须实现nibName初始化器,避免系统调用未实现的方法 init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(rootView: SwiftUIView()) } }
如果不需要通过nib方式初始化,也可以让init(nibName:bundle:)直接调用已实现的初始化逻辑,核心是确保所有可能被系统调用的初始化器都有对应实现。
内容的提问来源于stack exchange,提问作者zicxor
相关产品推荐
相关产品推荐

