Обновить строку в списке (SwiftUI) - PullRequest
0 голосов
/ 07 апреля 2020

Я ранняя пташка в программировании, поэтому я знаю, что этот вопрос может быть нелепым с точки зрения эксперта, но я застрял в этой ситуации в течение нескольких дней. Я хотел бы обновить строку с помощью кнопки «Редактировать» (карандаш) после использования другой кнопки для сохранения элемента с TextField.

Вот код:

class Food: Hashable, Codable, Equatable {

    var id : UUID = UUID()
    var name : String

    init(name: String) {
        self.name = name
    }

    static func == (lhs: Food, rhs: Food) -> Bool {
        return lhs.name == rhs.name
    }

    func hash(into hasher: inout Hasher) {
    hasher.combine(name)
    }
}

class Manager: ObservableObject {

    let objectWillChange = PassthroughSubject<Void, Never>()

    @Published var shoppingChart: [Food] = []

    init() {

            let milk = Food(name: "Milk")
            let coffee = Food(name: "Coffee")

            shoppingChart.append(milk)
            shoppingChart.append(coffee)        
    }

    func newFood(name: String) {
        let food = Food(name: name)
        shoppingChart.insert(food, at: 0)
    }
}

struct ContentView: View {

    @ObservedObject var dm : Manager
    @State var isAddFoodOpened = false

    var body: some View {
        VStack {
            List {
                ForEach(self.dm.shoppingChart, id:\.self) { food in
                    HStack {
                    Text(food.name)
                    Image(systemName: "pencil")
                }
            }

        }
            self.buttonAdd
    }
}

    var buttonAdd: some View {
        Button(action: {
            self.isAddFoodOpened.toggle()
        }) {
            Text("Add")
        }
        .sheet(isPresented: $isAddFoodOpened) {
            Add(dm: self.dm, fieldtext: "", isAddFoodOpened: self.$isAddFoodOpened)
        }
    }
}

struct Add: View {

    @ObservedObject var dm : Manager
    @State var fieldtext : String = ""
    @Binding var isAddFoodOpened : Bool

    var body: some View {
        VStack {
        TextField("Write a food", text: $fieldtext)
        buttonSave
    }
    }

    var buttonSave : some View {
        Button(action: {
            self.dm.newFood(name: self.fieldtext)
            self.isAddFoodOpened = false
        }) {
            Text("Save")
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Хорошо, поэтому, если я правильно понимаю, вы хотите обновить / отредактировать строку, используя кнопку «Редактировать». Это сделает это:

struct ContentView: View {

@ObservedObject var dm : Manager
@State var isAddFoodOpened = false
@State var isEditOpened = false
@State var fieldtext : String = ""

var body: some View {
    VStack {
        List {
            ForEach(0..<self.dm.shoppingChart.count, id:\.self) { i in
                HStack {
                    Text(self.dm.shoppingChart[i].name)
                    Button(action: { self.isEditOpened.toggle() }) {
                        Image(systemName: "pencil")
                    }.sheet(isPresented: self.$isEditOpened) {
                        TextField(self.dm.shoppingChart[i].name, text: self.$fieldtext, onEditingChanged: { _ in
                            self.dm.shoppingChart[i].name = self.fieldtext
                        })
                    }
                }
            }
        }
        self.buttonAdd
    }
}

var buttonAdd: some View {
    Button(action: {
        self.isAddFoodOpened.toggle()
    }) {
        Text("Add")
    }
    .sheet(isPresented: $isAddFoodOpened) {
        Add(dm: self.dm, fieldtext: "", isAddFoodOpened: self.$isAddFoodOpened)
    }
}
}
0 голосов
/ 07 апреля 2020

Объект @ObservedObject var dm : Manager никогда не инициализируется.

Попробуйте инициализировать дм в ContentView следующим образом:

@ObservedObject var dm = Manager()

...