SwiftUI:如何在 Pageable 中访问 ObservedObject?

Posted

技术标签:

【中文标题】SwiftUI:如何在 Pageable 中访问 ObservedObject?【英文标题】:SwiftUI: How can I access an ObservedObject within a Pageable? 【发布时间】:2021-02-06 15:14:20 【问题描述】:

我正在尝试从位于 MainView 的 Pageable 中的子视图访问文本字段:

struct MainView: View 
      var pages = [
        UIHostingController(rootView: FirstView(viewModel: viewModel)), // 1. error (without lazy var pages)
        UIHostingController(rootView: SecondaryView()), 
      ] 

     @StateObject var viewModel = MainViewModel()
     @State var pageIndex = 0
     var body: some View
         HStack
              Pageable(pageIndex: $pageIndex, viewControllers: pages) // 2. error (with lazy var pages)
         
     
  
struct FirstView: View 
        @ObservedObject var viewModel = MainViewModel()
        var body: some View
             NameTextfield(text: $viewModel.name, placeholder: Text("Name…"))
        

    首先,构建失败是因为它无法使用实例成员 viewModel,因为属性初始化程序在 'self' 可用之前运行。

    如果我使用惰性 var 页面,它会在 rootView 中接受 viewModel,但会在 viewControllers: pages 处抛出错误,它不能对不可变值使用变异 getter:'self' 是不可变的

在这种情况下,有没有办法将 viewModel 传递给 rootView,以便我可以从 MainView 中的视图访问 Textfield?

【问题讨论】:

【参考方案1】:

使用init

struct FirstView: View 
    @ObservedObject var viewModel: MainViewModel
    
    var body: some View
        NameTextfield(text: $viewModel.name, placeholder: Text("Name…"))
    


struct MainView: View 
    
    @StateObject var viewModel = MainViewModel()
    @State var pageIndex = 0
    
    private var pages: [UIViewController] = []
    
    init()  //<---Here
        pages = [UIHostingController(rootView: FirstView(viewModel: viewModel)), UIHostingController(rootView: SecondaryView())]
    

    var body: some View
        HStack
            Pageable(pageIndex: $pageIndex, viewControllers: pages)
        
    

【讨论】:

感谢您的回答。如果我在 MainView 中print("\(viewModel.name)"),我什么也得不到/零。在FirstView(...) 上的init() 中,我收到紫色警告:"Accessing StateObject's object without being installed on a View. This will create a new instance each time." 更新:一旦我在 MainView 中将 StateObject 更改为 ObservedObject,它就可以工作

以上是关于SwiftUI:如何在 Pageable 中访问 ObservedObject?的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Pageable 访问值问题之前调用“Optional#isPresent()”

如何在spring boot中使用Pageable接口从http url中删除/处理不相关或错误的排序参数?

如何使用 Pageable 在 Spring Boot 和 Thymeleaf 中显示按点赞数排序的技能列表?

如何在 SwiftUI 中随时从子视图作为父视图访问数据?

如何在 SwiftUI 中访问视图的修饰符?

如何在 SwiftUI 视图中访问 UIView 子类的属性?