UIViewController(), title: "UIViewControllerRepresentable") } } SwiftUI in UIKit UIKit 中使用 SwiftUI,需要通过UIHostingController // 可以是复杂的ContentView let vc = UIHostingController(rootView: ContentView()) // 也可以是简单的Text等其他View let vc = UIHostingController(rootView: Text("Hello SwiftUI"))
UIViewController(), title: "UIViewControllerRepresentable") } } SwiftUI in UIKit SwiftUI 中的 View 需要使用UIHostingController UIHostingController 在开发 iOS 项目章节已经分析过启动流程,就是通过UIHostingController包装 ContentView,然后赋值给window.rootViewController // 可以是复杂的ContentView let vc = UIHostingController(rootView: ContentView()) // 也可以时简单的Text等其他View let vc = UIHostingController(rootView: Text("Hello SwiftUI"))
接下来需要把 Swift UI View 用在 UIKit 中,需要用到 Swift UI 中的 UIHostingController 。这是可以把 Swift UI 包装成 UIView。 } COPY 方便起见,以上代码使用了 SnapKit,在运行之前请先下载安装 SnapKit 在再底下加个方法 swift 1@objc func click() { 2 let vc = UIHostingController 将 ViewController 中 viewDidLoad 中代码替换成 swift 1super.viewDidLoad() 2let hostVc = UIHostingController(rootView swift 1var hv = UIHostingController(rootView: TestView()) 2var myNavigationController = UINavigationController
. // Use a UIHostingController as window root view controller let window = UIWindow( frame: UIScreen.main.bounds) window.rootViewController = UIHostingController(rootView: ContentView ()) self.window = window window.makeKeyAndVisible() } 细心的朋友会发现多个了UIHostingController
window = UIWindow(windowScene: windowScene) //设置window的rootViewController window.rootViewController = UIHostingController ContentView,UI 界面就可以显示出来 这段代码应该很熟悉,在UIKit纯代码构建 iOS 程序中,会经常在 AppDelegate中写上类似的代码,不同的就是rootViewController为UIHostingController 类型的,UIHostingController是UIViewController的子类,主要负责接受一个SwiftUI的View的描述并将其用UIKit进行渲染 ContentView.swift import
let contentView = BaseTabbarView() // Use a UIHostingController as window root view controller let window = UIWindow(windowScene: windowScene) window.rootViewController = UIHostingController 简单看看Na+Tb的代码 ---- 从SceneDelegate开始, 根控制器就是 UIHostingController,我们需要做的第一步就是设置它的根视图 rootView // Create the SwiftUI view that provides the window contents. let contentView = BaseTabbarView() // Use a UIHostingController let window = UIWindow(windowScene: windowScene) window.rootViewController = UIHostingController
Bodayle 解释说,与 UIKit 实现相比,现在的代码量大约减少到原来的六分之一,而且没有出现与 SwiftUI 响应性相关的性能损失,除了实例化 UIHostingController 时的一点开销
200 : 0, for: .scrollContent ) } }}let viewController = UIHostingController
let window = UIWindow(windowScene: windowScene) window.rootViewController = UIHostingController 接着为SwiftUI项目创建了ContentView实例,并通过使用UIHostingController将其添加为根视图控制器。 该控制器用于将基于SwiftUI的视图显示在屏幕上。
SwiftUI虽然简化了界面代码,但底层依然依赖 UIHostingController 进行视图转换,若在 body 属性中嵌套过深的视图结构,或使用 @State 管理过多需要实时更新的状态变量,会导致渲染树的重建成本激增
可以将其放置在 Text 中的任意位置由于范例代码中采用了 SwiftUI 4 提供的 ImageRenderer 完成视图至图片的转换,因此仅支持 iOS 16+在低版本的 SwiftUI 中,可以通过用 UIHostingController 但由于 UIHostingController 仅能运行于主线程,因此这种转换操作对主线程的影响较大,请自行取舍总结在读完本文后,或许你的第一感受是 SwiftUI 好笨呀,竟然需要如此多的操作才能完成这种简单的需求
model.load() let contentView = ContentView() .environmentObject(model) // Use a UIHostingController UIWindowScene { let window = UIWindow(windowScene: windowScene) window.rootViewController = UIHostingController
escaping () -> Content) -> some View { introspectTextField { td in let viewController = UIHostingController content: Content) -> some View { introspectTextField { td in let viewController = UIHostingController
} } } } // 需要注意此时需要修改SceneDelegate,传入environmentObject window.rootViewController = UIHostingController
onAppear、init、viewDidLoadQ:在我的应用程序中,我在 UIHostingController 中托管了 SwiftUI 视图,这些视图都处于一个 UITabBarController A:当在其他类型的 UIViewControllers 中使用 UIHostingController 时,你可能会通过调用托管控制器的方法来触发视图加载提前发生。
此外,介绍了如何在 SwiftUI 和 UIKit 之间进行互操作,例如使用 UIViewRepresentable 或 UIHostingController 实现混合使用。
#### 4.2 UIKit 集成- **UIHostingController**:学习如何在 UIKit 中嵌入 SwiftUI 视图。