首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将变量从UIHostingController传递给SWIFTUI视图

将变量从UIHostingController传递给SWIFTUI视图
EN

Stack Overflow用户
提问于 2021-12-19 10:15:15
回答 1查看 884关注 0票数 0

我有一个故事板应用程序,现在从我现有应用程序中的SwiftUI视图开始。我有一个API调用来填充变量,例如:名称、姓氏、电子邮件和移动。

如何将UIKit变量传递到UIHostingController中以在SwiftUI视图中显示?

我的故事板UIKit文件:

代码语言:javascript
复制
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视图:

代码语言:javascript
复制
import SwiftUI

struct UserDashboard: View {
    
    var body: some View {
        NavigationView{

           Text(name)
           Spacer()
           Text(surname)
           Spacer()
           Text(email)
           Spacer()
           Text(mobile)
           Spacer()
       }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-19 10:34:08

将这些属性从控制器移到独立视图模型类中,并将该类的实例传递到SwiftUI视图中,如下所示。

*还可以将相同的模型传递到getAPI函数中,以更新模型的属性。(注意:必须更新主队列上的属性才能刷新SwiftUI视图!)

代码语言:javascript
复制
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()
       }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70410519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档