如何从 SwiftUI 调用 UIViewController

Fay*_*ouz 5 uikit swift swiftui

我有一个 SwiftUI TabView,第二个选项卡项需要显示 UIViewController。如何将 UIViewController 嵌入到第二个选项卡中?

class MyUIVC: UIViewController {.....}
Run Code Online (Sandbox Code Playgroud)

以下是我想要的一些伪代码:

struct myTabView: View {
@State var selectedTab: Int = 0
var body: some View {
    mySwiftUIView
      .tabItem { Text("First Tab") }
      .tag(0)

    MyUIVC //This is what I want to do with my UIViewController
      .tabItem { Text("Second Tab") }
      .tag(1)
 }
 }
Run Code Online (Sandbox Code Playgroud)

bin*_*t84 5

您需要使用桥接 ViewController UIViewControllerRepresentable.。Apple 在此处提供了有关如何使用它的文档:

https://developer.apple.com/documentation/swiftui/uiviewcontrollerrepresentable

此外,他们的 SwiftUI 课程中有一个有效的示例,最引人注目的是标题为“Interface with UIKit”的课程,可以在此处找到:

https://developer.apple.com/tutorials/swiftui/interface-with-uikit

他们正在使用的示例 ViewController 如下所示:


struct PageViewController: UIViewControllerRepresentable {
    var controllers: [UIViewController]

    func makeUIViewController(context: Context) -> UIPageViewController {
        let pageViewController = UIPageViewController(
            transitionStyle: .scroll,
            navigationOrientation: .horizontal)

        return pageViewController
    }

    func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
        pageViewController.setViewControllers(
            [controllers[0]], direction: .forward, animated: true)
    }

    class Coordinator: NSObject {
        var parent: PageViewController

        init(_ pageViewController: PageViewController) {
            self.parent = pageViewController
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

话虽这么说,桥接 ViewController 的核心和灵魂是:

1)为ViewController创建一个具有唯一名称的结构体,该结构体继承自UIViewControllerRepresentable

makeUIViewController(context: Context)2)使用UIViewController的返回类型实现该函数

updateUIViewController(_ uiViewController: YourUIViewController, context: Context)3)实现不带返回的函数

4) 根据需要,实现一个Coordinator继承自NSObject您需要的任何委托协议的类。

还有更多的内容取决于您需要 ViewController 做什么,但这应该会让您指向正确的方向。