如何以 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】:

如果没有您对 AuthenticatorUsersViewModel 的定义,我无法完全重现您的代码,但我可以编译它:

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 弹出所有视图

在 StateObject 初始化之前应用程序委托中的 Firebase 初始化

StateObject 属性不会更新视图,但 ObservedObject 会