Как инициализировать представление с помощью stateobject в качестве параметра?

#swift #xcode #swiftui

#swift #xcode #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 { }
}
 

Я пытаюсь вручную инициализировать представление, которое принимает a 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»

чтобы лучше понять, что такое оболочки свойств и как их использовать.

Комментарии:

1. Это действительно ответ на этот вопрос.