将变量从 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()
}
}
}
我有一个故事板应用程序,现在开始在我现有的应用程序中使用 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()
}
}
}