如何使用 stateobject 作为参数初始化视图?

set*_*eee 4 xcode swift swiftui

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 { }}
Run Code Online (Sandbox Code Playgroud)

我正在尝试手动初始化一个将 aStateObject作为参数的视图。我收到一个错误:Cannot assign to property: 'auth' is a get-only property。编写初始化程序的正确方法是什么?

Moz*_*ler 5

如果没有您对Authenticatorand的定义,我无法完全重现您的代码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")
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是关键的变化:

init(_ viewModel: ObservedObject<UsersViewModel>, _ auth: Authenticator) {
    _viewModel = viewModel
    _auth = StateObject(wrappedValue: auth)
Run Code Online (Sandbox Code Playgroud)

如果你不明白我的变化,你应该谷歌

“快速属性包装器”

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