Как обновить значения структуры в представлении

В SwiftUI у меня есть структура, которая хочет хранить данные представления. Допустим, есть представление, в котором пользователь может создать рецепт. Он имеет текстовое поле для ввода имени рецепта и параметры для выбора и добавления в массив в свойствах структуры.

Мне удалось создать структуру и ввести ее в представление, но я не могу изменить ее значения. Значения структуры должны обновляться в зависимости от того, что пользователи делают в представлении, и информации, которую они добавляют к нему. Я сделал простое представление, что все, что введено в TextField, будет добавлено в одно из свойств структуры. Для приведенного ниже кода я получаю Cannot assign to property: 'self' неизменяемо

struct Recipe: Codable {
let user: Int
var recipeName, createdDate: String
let ingredients: [Ingredient]
let equipment: [[Int]]

enum CodingKeys: String, CodingKey {
    case user = "User"
    case recipeName = "RecipeName"
    case createdDate
    case ingredients = "Ingredients"
    case equipment = "Equipment"
 }
}

struct Ingredient: Codable {
   let ingredient, size: Int
}

ПОСМОТРЕТЬ:

struct ContentView: View {
    var recipe = Recipe(user: 1231, recipeName: "Recipe Name", createdDate: "SomeDate", ingredients: [Ingredient(ingredient: 1, size: 2)], equipment: [[1],[4],[5]])


    var body: some View {
        VStack {
            Text(self.recipe.recipeName)
            Button(action: {
                recipe.recipeName = "New Name" //Cannot assign to property: 'self' is immutable
            }) {
                Text("Change Name")
            }
        }
    }
}

Есть идеи, как решить эту проблему, чтобы я мог взаимодействовать со структурой и обновлять ее свойства. Я также буду использовать эту структурную переменную в других представлениях.

заранее спасибо

2 ответа

Решение

Для представленного варианта использования наиболее подходящим является использование модели представления, как в примере ниже.

class RecipeViewModel: ObservableObject {
   @Published recipe: Recipe
   init(_ recipe: Recipe) {
     self.recipe = recipe
   }
}

так что ввиду

struct ContentView: View {
    @ObservedObject var recipeVM = RecipeViewModel(Recipe(user: 1231, recipeName: "Recipe Name", createdDate: "SomeDate", ingredients: [Ingredient(ingredient: 1, size: 2)], equipment: [[1],[4],[5]]))


    var body: some View {
        VStack {
            Text(self.recipeVM.recipe.recipeName)
            Button(action: {
                self.recipeVM.recipe.recipeName = "New Name"
            }) {
                Text("Change Name")
            }
        }
    }
}

Добавить @State

@State var recipe = Recipe(..

Также не забудьте добавить self. Перед использованием recipe внутри действия кнопки.

Другие вопросы по тегам