ForEach onDelete Mac - PullRequest
       0

ForEach onDelete Mac

0 голосов
/ 27 февраля 2020

Я пытаюсь выяснить, как удалить из массива в swiftui для Ма c. Все статьи, которые я могу найти, показывают, как это сделать способом UIKit с помощью метода .ondelete, добавленного в foreach. Это не работает для Ma c, потому что у меня нет красной кнопки удаления, как iOS. Итак, как мне удалить элементы из массива в ForEach на Ma c. вот код, который я пробовал, который дает мне ошибку

Fatal error: Index out of range: file

import SwiftUI

struct ContentView: View {

    @State var splitItems:[SplitItem] = [
        SplitItem(id: 0, name: "Item#1"),
        SplitItem(id: 1, name: "Item#2")
    ]

    var body: some View {
        VStack {
            Text("Value: \(self.splitItems[0].name)")
            ForEach(self.splitItems.indices, id:\.self) { index in
                HStack {
                    TextField("Item# ", text: self.$splitItems[index].name)
                    Button(action: {self.removeItem(index: index)}) {Text("-")}
                }
            }
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    }

    func removeItem(index:Int) {
        self.splitItems.remove(at: index)
    }

}

struct SplitItem:Identifiable {
    var id:Int
    var name:String
}

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Ваша кодовая часть ForEach полностью верна. Возможным источником ошибки может быть строка Text("Value: \(self.splitItems[0].name)") - после удаления всех элементов это обязательно приведет к sh.

Следующим предположением будет VStack. После отрисовки иерархии вида это не позволит ее изменить. Если вы замените VStack на Group , и будет работать следующий код:

var body: some View {
    Group {
        if !self.splitItems.isEmpty {
            Text("Value: \(self.splitItems[0].name)")
        } else {
            Text("List is empty")
        }
        ForEach(self.splitItems.indices, id:\.self) { index in
            HStack {
                TextField("Item# ", text: self.$splitItems[index].name)
                Button(action: {self.removeItem(index: index)}) {Text("-")}
            }
        }
    }
    .frame(maxWidth: .infinity, maxHeight: .infinity)
}
0 голосов
/ 28 февраля 2020

, поэтому я смог найти ответ в этой статье ,

вместо вызова array.remove (at), передав индекс из функции l oop, вызываемой с помощью array.FirstIndex (где).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...