将数据从 UIKit 传递到 SwiftUI(容器 UIHostingController)

Yug*_*gue 5 swift swiftui

如何在UIViewController和之间传递数据struct ContentView

我试过,ObservableObject但我无法获得最新的数据。

Jam*_*mes 8

我发现现有的答案令人困惑/不完整,也许 Swift 5.3 等中的通用推理发生了一些变化。虽然您可以将环境对象添加到 UIHostingController 的视图中,但这似乎与类型冲突(即 UIHostingController 的通用参数需要具体类型) 。添加AnyView解决了这个问题:

import UIKit
import SwiftUI

struct TutorialView: View {
    
    @EnvironmentObject private var integration: TutorialIntegrationService
    
    var body: some View {
        Text("Hi").navigationBarTitle("test: \(integration.id)")
    }
}

class TutorialIntegrationService: ObservableObject {
    @Published var id: Int = 0
}

class TutorialViewController: UIHostingController<AnyView> {
    
    let integration = TutorialIntegrationService()
    
    required init?(coder: NSCoder) {
        super.init(coder: coder,rootView: AnyView(TutorialView().environmentObject(integration)));
    }
}
Run Code Online (Sandbox Code Playgroud)


Adr*_*ian 5

要将数据从 a 传递到 aUIViewController内的 SwiftUI-Struct ,UIHostingController您可以将 an 附加environmentObject到 SwiftUI rootView

let vc = UIHostingController(rootView: YourContentView().environmentObject(yourEnvironmentObject))
Run Code Online (Sandbox Code Playgroud)

当然,您需要创建一个 ObservableObject 并将其添加到您的 SwiftUI-Struct。

创建可观察对象:

class TypeOfEnvironmentObject: ObservableObject {
    @Published var data = "myData"
}
Run Code Online (Sandbox Code Playgroud)

将其添加到您的结构中:

@EnvironmentObject var yourEnvironmentObject: TypeOfEnvironmentObject
Run Code Online (Sandbox Code Playgroud)


Yug*_*gue 4

  1. 添加class myclassname: ObservableObject

  2. 在类中创建一个变量并@Published var myvar添加:

    init(myvar: type) {
      self.myvar = myvar
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加UIViewController

    private var model = myclassname(myvar: XXX)`
    
    Run Code Online (Sandbox Code Playgroud)

    viewWillAppear添加:

    let vc = myclassname(myvar: myvar)
    let childView = UIHostingController(rootView: ContentView(model: vc))
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在添加中struct

    @ObservedObject var model: myclassname
    
    Run Code Online (Sandbox Code Playgroud)