Comment passer des données entre UIViewController
et struct ContentView
?
J'ai essayé avec ObservableObject
mais je ne parviens pas à mettre à jour les données.
3 Réponses :
Pour transmettre des données d'un UIViewController
à un SwiftUI-Struct dans un UIHostingController
vous pouvez attacher un environmentObject
à SwiftUI rootView
:
@EnvironmentObject var yourEnvironmentObject: TypeOfEnvironmentObject
Bien sûr, vous devrez créer un ObservableObject et l'ajouter à votre SwiftUI-Struct.
Créez l'ObservableObject:
class TypeOfEnvironmentObject: ObservableObject { @Published var data = "myData" }
Ajoutez-le à votre structure:
let vc = UIHostingController(rootView: YourContentView().environmentObject(yourEnvironmentObject))
Merci! Guys😃. Ouais, je l'ai déjà fait. Mais lorsque la valeur des données est mise à jour, ma structure ne prend pas les mises à jour, elle reste avec la valeur d'initialisation.
Ok, je pense que j'ai compris ce que vous essayez de faire. Si je vous ai bien compris, le Combine-Framework est ce que vous recherchez: developer.apple.com/documentation/combine/...
Avec Combine, vous pouvez connecter un éditeur dans votre UIViewController avec un abonné dans votre SwiftUI-Struct. Lorsque vos données changent, vous pouvez utiliser l'éditeur pour avertir l'abonné.
J'essaye, mais je ne comprends pas le concept. Pouvez-vous me donner un petit exemple? 😅
merci beaucoup les gars pour vos réponses. J'ai réussi avec ObservableObject
et je vais essayer de détailler si cela peut aider quelqu'un d'autre.
class myclassname: ObservableObject
dans la classe, créez une variable avec @Published var myvar
et créez init(myvar: type) { self.myvar = myvar }
UIViewController
créer private var model = myclassname(myvar: XXX)
et dans viewWillAppear------>let vc = myclassname(myvar: myvar) let childView = UIHostingController(rootView: ContentView(model: vc))
struct ---> @ObservedObject var model: myclassname
J'ai trouvé les réponses existantes confuses / incomplètes, peut-être quelque chose a changé autour de l'inférence générique dans Swift 5.3 etc. Bien que vous puissiez ajouter un objet d'environnement à la vue de UIHostingController, cela semble entrer en conflit avec les types (c'est-à-dire que le paramètre générique de UIHostingController a besoin d'un type concret) . L'ajout d' AnyView
résout ceci:
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))); } }
Pourriez-vous fournir plus de détails sur ce que vous essayez de faire? Publier le code source (de ce que vous avez déjà essayé) aiderait certainement.
Avez-vous jeté un œil à
updateUIViewController(_:,context:)
?mon application (UIKit) a une vue contenant un conteneur (Swiftui) et je souhaite transmettre les données de ma vue (UIViewcontroller) à mon conteneur (UIHostingController).
Vous pouvez attacher un
environmentObject
à votre SwiftUI rootView. J'écrirai une réponse expliquant comment l'utiliser.