如何解决使用UIHostingController访问其addSubview中的ViewController数据
我有一个嵌入在视图控制器中的表单,如下所示:
let formController = UIHostingController(rootView: PostCallForm())
if let form = formController.view {
form.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(form)
self.addChild(formController)
嵌入该视图的视图通过MVC设置获取数据,如下所示:
class ClientInfoController: UIViewController {
var client: Calls? {
didSet {
infoLabel.text = client?.callID
}
}
我的表单位于单独的文件form.swift
中:
struct PostCallForm: View {
var body: some View {
NavigationView {
Form {
Toggle(isOn: $submission.fieldOne ) {
Text("Field One")
}
Toggle(isOn: $submission.fieldTwo ) {
Text("Field Two")
}
Toggle(isOn: $submission.fieldThree ) {
Text("Field Three")
}
Section {
Button(action: {
self.placeSubmission()
}){
Text("Submit")
}
}
}
.alert(isPresented: $showingConfirmation) {
Alert(title: Text("Call Submitted!"),message: Text(confirmationMessage),dismissButton: .default(Text("Dismiss"))
)
}
}
}
我需要能够访问表单中的ViewController var client: Calls?
数据,以便可以在表单的完成处理程序中引用client.callID
。最好的非骇客方式是什么?
解决方法
这是可行的方法:
// Introduce view model for form
class FormViewModel: ObservableObject {
@Published var client: Calls? = nil
}
class ClientInfoController: UIViewController {
private var formVM = FormViewModel() // create form view model
var client: Calls? {
didSet {
infoLabel.text = client?.callID
formVM.client = client // << update !!
}
}
...
let formController = UIHostingController(rootView:
PostCallForm().environmentObject(formVM)) // << inject !!
...
struct PostCallForm: View {
@EnvironmentObject var vm: FormViewModel // << use !!
var body: some View {
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。