是否可以使用现有的UIKit应用程序并排使用SwiftUI构建视图?

我有一个用Objective-C编写的现有应用程序.我已经开始迁移到Swift 5.我想知道我是否可以在使用现有UIKit的同时使用SwiftUI.xib观点.

也就是说,我希望在同一个应用程序中使用SwiftUI构建一些视图,使用UIKit构建一些其他视图.当然不能把两者混为一谈.

SomeObjCSwiftProject/
    SwiftUIViewController.swift
    SwiftUIView.xib
    UIKitViewController.swift
    UIKitView.xib

一起工作

推荐答案

edit 05/06/19: Added information about UIHostingController as suggested by @Departamento B in his answer. Credits go to him!


在UIKit中使用SwiftUI

通过将SwiftUI View包装成UIHostingController,可以在现有UIKit环境中使用SwiftUI个组件,如下所示:

let swiftUIView = SomeSwiftUIView() // swiftUIView is View
let viewCtrl = UIHostingController(rootView: swiftUIView)

它也可以覆盖UIHostingController,并根据需要定制,例如,如果preferredStatusBarStyle不能按预期通过SwiftUI工作,则手动设置preferredStatusBarStyle.

UIHostingControllerhere.


在SwiftUI中使用UIKit

如果现有的UIKit视图应该在SwiftUI环境中使用,那么UIViewRepresentable协议就是有帮助的!这篇教程可以在Apple this中看到,也可以在Apple here中看到.


Compatibility

请注意,您不能在iOS版本上使用SwiftUI<;iOS 13,as SwiftUI仅在iOS 13及以上版本上可用.更多信息请参见this篇帖子.

如果你想在目标低于iOS 13的项目中使用SwiftUI,你需要用@available(iOS 13.0.0, *)属性标记你的SwiftUI结构.

Swift相关问答推荐

如何使用 Date.ParseStrategy 在 Swift 5.6 中将字符串解析为日期?

macOS 守护进程应该由“Command Line Tool”Xcode 模板制作吗?

否定 #available 语句

SwiftUI:如何让 TextField 成为第一响应者?

iPhone 不可用.请重新连接设备. / iOS 14.2 - Xcode 12.1

多个工作表(isPresented :) 在 SwiftUI 中不起作用

SwiftUI 中有没有一种模糊背景的方法?

找不到目标“x86_64-apple-ios-simulator”的模块

检测 iOS 暗模式更改

Swift 用户界面.如何更改 TextField 的占位符 colored颜色 ?

UIWindow 未在 iOS 13 中显示内容

SwiftUI 中的几何阅读器是什么?

SceneDelegate 和 AppDelegate 的区别

Xcode忽略导入

在 SwiftUI 中水平居中视图

SwiftUI 是否向后兼容 iOS 12.x 及更早版本?

Swift 5.0:不推荐使用“withUnsafeBytes”:使用 `withUnsafeBytes(...)

UITabBar 项目在 iOS 12.1 上跳转后退导航

DispatchQueue:不能在非主线程上使用 asCopy = NO 调用

UIImageJPEGRepresentation 已被实例方法 UIImage.jpegData(compressionQuality:) 替换