将变量从 UIHostingController 传递到 SWIFTUI 视图

Pass a variable from UIHostingController to SWIFTUI view

我有一个故事板应用程序,现在开始在我现有的应用程序中使用 SwiftUI 视图。我有一个 API 调用来填充变量,例如:名字、姓氏、电子邮件和手机。

如何在我的 UIHostingController 中传递 UIKit 变量以显示在 SwiftUI 视图中?

我的故事板 UIKit 文件:

import UIKit
import SwiftUI
class UserDashboardHostVC: UIViewController {
    
    var name = String()
    var surname = String()
    var email = String()
    var mobile = String()
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        getAPIdata() 
        //this populates the above 4 variables.    
        
        let controller = UIHostingController(rootView: UserDashboard())
        controller.view.translatesAutoresizingMaskIntoConstraints = false
        self.addChild(controller)
        self.view.addSubview(controller.view)
        controller.didMove(toParent: self)
    }
}

我的 SwiftUI 视图:

import SwiftUI

struct UserDashboard: View {
    
    var body: some View {
        NavigationView{

           Text(name)
           Spacer()
           Text(surname)
           Spacer()
           Text(email)
           Spacer()
           Text(mobile)
           Spacer()
       }
    }
}

将这些属性从控制器移至独立视图模型 class 并将该 class 的实例传递至 SwiftUI 视图,如下所示。

*您也可以将相同的模型传递给 getAPI 函数来更新模型的属性。 (注意:必须在主队列上更新属性才能刷新 SwiftUI 视图!)

class UserDashboardModel: ObservableObject {
    @Published var name = String()
    @Published var surname = String()
    @Published var email = String()
    @Published var mobile = String()
}

class UserDashboardHostVC: UIViewController {

    var model = UserDashboardModel()      // << here owner !!


    override func viewDidLoad() {
        super.viewDidLoad()

        getAPIdata()             // << can be injected here
        //this populates the above 4 variables.

        let controller = UIHostingController(rootView: UserDashboard(model: self.model))     // << here !!
        controller.view.translatesAutoresizingMaskIntoConstraints = false
        self.addChild(controller)
        self.view.addSubview(controller.view)
        controller.didMove(toParent: self)
    }
}

struct UserDashboard: View {
    @ObservedObject var model: UserDashboardModel    // << here !!

    var body: some View {
        NavigationView{

           Text(model.name)
           Spacer()
           Text(model.surname)
           Spacer()
           Text(model.email)
           Spacer()
           Text(model.mobile)
           Spacer()
       }
    }
}