SwiftUI Установка начального значения выбора из CoreData - PullRequest
2 голосов
/ 07 марта 2020

Я дергаю себя за волосы, пытаясь понять, как заставить мой сборщик показать уже сохраненное значение CoreData. Я хочу, чтобы он отображался в правой части окна выбора, как если бы пользователь только что его выбрал. Я попытался добавить self.updatedItemAttribute = self.editItem.attribute ?? "" до выбора, чтобы установить начальное значение, но это не создает. Я также попытался определить его в @State (например, @State var updatedItemAttribute: String = self.editItem.attribute), но это также не создает. Если я добавлю TextField до выбора, он установит значение, но я не хочу иметь TextField со значением только для того, чтобы его установить. Любые идеи о том, как мне установить updatedItemAttribute на editItem.attribute непосредственно перед сборщиком? Спасибо.

import CoreData
import SwiftUI

struct EditItemView: View {
    @Environment(\.managedObjectContext) var moc
    @Environment(\.presentationMode) var presentationMode
    @ObservedObject var editItem: Item

    @State var updatedItemName: String = ""
    @State var updatedItemAttribute: String = ""

    let attributes = ["Red", "Purple", "Yellow", "Gold"]

    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Name of item", text: $updatedItemName)
                        .onAppear {
                            self.updatedItemName = self.editItem.name ?? ""
                    }
                    Picker("Test attribute", selection: self.$updatedItemAttribute) {
                        ForEach(attributes, id: \.self) {
                            Text($0)
                                .onAppear {
                                    self.updatedItemAttribute = self.editItem.attribute ?? ""
                                }
                        }
                    }
                }
...

1 Ответ

2 голосов
/ 07 марта 2020

Вы должны сделать это в init, как показано ниже

struct EditItemView: View {
    @Environment(\.managedObjectContext) var moc
    @Environment(\.presentationMode) var presentationMode
    @ObservedObject var editItem: Item

    @State private var updatedItemName: String
    @State private var updatedItemAttribute: String

    init(editItem item: Item) {             // << updated here
        self.editItem = item
        self._updatedItemName = State<String>(initialValue: item.name ?? "")
        self._updatedItemAttribute = State<String>(initialValue: item.attribute ?? "")
    }

    let attributes = ["Red", "Purple", "Yellow", "Gold"]

    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Name of item", text: $updatedItemName)
                    Picker("Test attribute", selection: self.$updatedItemAttribute) {
                        ForEach(attributes, id: \.self) {
                            Text($0)
                        }
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...