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中删除/处理不相关或错误的排序参数?