将数据从UIKit传递到SwiftUI(容器UIHostingController)
如何在将数据从UIKit传递到SwiftUI(容器UIHostingController),swift,swiftui,Swift,Swiftui,如何在UIViewController和struct ContentView之间传递数据 我尝试了使用ObservableObject,但无法获取最新的数据。要将数据从UIViewController传递到UIHostingController中的SwiftUI结构,可以将环境对象附加到SwiftUIrootView: let vc = UIHostingController(rootView: YourContentView().environmentObject(yourEnvironmen
UIViewController
和struct ContentView
之间传递数据
我尝试了使用
ObservableObject
,但无法获取最新的数据。要将数据从UIViewController
传递到UIHostingController
中的SwiftUI结构,可以将环境对象
附加到SwiftUIrootView
:
let vc = UIHostingController(rootView: YourContentView().environmentObject(yourEnvironmentObject))
当然,您需要创建一个ObserveObject并将其添加到SwiftUI结构中
创建ObserveObject:
class TypeOfEnvironmentObject: ObservableObject {
@Published var data = "myData"
}
将其添加到结构中:
@EnvironmentObject var yourEnvironmentObject: TypeOfEnvironmentObject
类myclassname:ObservableObject
@Published var myvar
创建变量并创建init(myvar:type){
self.myvar=myvar
}
UIViewController
createprivate var model=myclassname(myvar:XXX)
中,在View中将出现------->让vc=myclassname(myvar:myvar)
让childView=UIHostingController(rootView:ContentView(model:vc))
struct-->@ObservedObject变量模型中:myclassname
我发现现有答案令人困惑/不完整,可能是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)));
}
}
导入UIKit
导入快捷键
结构教程视图:视图{
@EnvironmentObject私有var集成:TutorialIntegrationService
var body:一些观点{
Text(“Hi”).navigationBarTitle(“测试:\(integration.id)”)
}
}
类TutorialIntegrationService:ObserveObject{
@已发布的变量id:Int=0
}
类TutorialViewController:UIHostingController{
let integration=TutorialIntegrationService()
必需初始化?(编码器:NSCoder){
init(coder:coder,rootView:AnyView(TutorialView().environmentObject(integration));
}
}
您能提供一些关于您正在尝试做什么的详细信息吗?发布(您已经尝试过的)源代码肯定会有帮助。您是否查看了updateUIViewController(:,context:)
?我的应用程序(UIKit)有一个包含容器(Swiftui)的视图,我想将数据从我的视图(UIViewcontroller)传递到我的容器(UIHostingController)。您可以将环境对象
附加到SwiftUI根视图。我会写一个答案解释如何使用它。谢谢!我想我明白你想做什么了。如果我没说错的话,那么Combine框架就是您想要的:使用Combine,您可以将UIViewController中的发布服务器与SwiftUI结构中的订阅服务器连接起来。当您的数据发生更改时,您可以使用发布者通知订阅者。我正在尝试,但我不明白这个概念。你能给我举个小例子吗?非常感谢你们的回答。我已经成功地使用了observateObject
,我将尝试详细说明它是否能帮助其他人。