我有一个故事板应用程序,现在从我现有应用程序中的SwiftUI视图开始。我有一个API调用来填充变量,例如:名称、姓氏、电子邮件和移动。
如何将UIKit变量传递到UIHostingController中以在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()
}
}
}发布于 2021-12-19 10:34:08
将这些属性从控制器移到独立视图模型类中,并将该类的实例传递到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()
}
}
}https://stackoverflow.com/questions/70410519
复制相似问题