Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据从UIKit传递到SwiftUI(容器UIHostingController)_Swift_Swiftui - Fatal编程技术网

将数据从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结构,可以将
环境对象
附加到SwiftUI
rootView

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
    }

  • 在my
    UIViewController
    create
    private var model=myclassname(myvar:XXX)
    中,在
    View中将出现------->让vc=myclassname(myvar:myvar)
    让childView=UIHostingController(rootView:ContentView(model:vc))
  • 在my
    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
    ,我将尝试详细说明它是否能帮助其他人。