如何以 stateobject 作为参数初始化视图?
Posted
技术标签:
【中文标题】如何以 stateobject 作为参数初始化视图?【英文标题】:How to initialize a view with a stateobject as a parameter? 【发布时间】:2020-11-20 23:38:49 【问题描述】:struct ProfileEditView: View
@ObservedObject var viewModel: UsersViewModel
@StateObject var auth: Authenticator
@State var showingImageEditor: Bool = false
init(_ viewModel: UsersViewModel, _ auth: Authenticator)
self.viewModel = viewModel
self.auth = auth
UITableView.appearance().backgroundColor = UIColor.clear
UITableViewCell.appearance().selectionStyle = .none
var body: some View
我正在尝试手动初始化一个以StateObject
作为参数的视图。我收到一个错误:Cannot assign to property: 'auth' is a get-only property
。编写初始化程序的正确方法是什么?
【问题讨论】:
【参考方案1】:如果没有您对 Authenticator
和 UsersViewModel
的定义,我无法完全重现您的代码,但我可以编译它:
class UsersViewModel: ObservableObject
class Authenticator: ObservableObject
struct ProfileEditView: View
@ObservedObject var viewModel: UsersViewModel
@StateObject var auth: Authenticator
@State var showingImageEditor: Bool = false
init(_ viewModel: ObservedObject<UsersViewModel>, _ auth: Authenticator)
_viewModel = viewModel
_auth = StateObject(wrappedValue: auth)
UITableView.appearance().backgroundColor = UIColor.clear
UITableViewCell.appearance().selectionStyle = .none
var body: some View
Text("something")
这些是关键变化:
init(_ viewModel: ObservedObject<UsersViewModel>, _ auth: Authenticator)
_viewModel = viewModel
_auth = StateObject(wrappedValue: auth)
如果你不明白我的改变,你应该谷歌
"swift 属性包装器"
更好地了解什么是属性包装器以及如何使用它们。
【讨论】:
以上是关于如何以 stateobject 作为参数初始化视图?的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:如何在父视图中初始化新的 StateObject?
如何防止 SwiftUI 像使用 @StateObject 一样重新初始化我的包装属性?
SwiftUI onChange(of: ...) 更新 StateObject
从子视图设置 StateObject 值会导致 NavigationView 弹出所有视图