【问题标题】:How to initialize a view with a stateobject as a parameter?如何以 stateobject 作为参数初始化视图?
【发布时间】: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。编写初始化程序的正确方法是什么?

【问题讨论】:

    标签: swift xcode swiftui


    【解决方案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 属性包装器"

    更好地了解什么是属性包装器以及如何使用它们。

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多