Как обновить значения структуры в представлении
В 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
внутри действия кнопки.