【问题标题】:SwiftUI: How can I access an ObservedObject within a Pageable?SwiftUI:如何在 Pageable 中访问 ObservedObject?
【发布时间】: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…"))
        }
}
  1. 首先,构建失败是因为它无法使用实例成员 viewModel,因为属性初始化程序在 'self' 可用之前运行。

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

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

【问题讨论】:

    标签: mvvm swiftui viewmodel


    【解决方案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,它就可以工作
    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 2020-01-25
    • 2020-08-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多