Сбой при удалении элементов в списке в модальном представлении в SwiftUI - PullRequest
0 голосов
/ 21 июня 2020

при попытке удалить элемент в списке из модального представления получает cra sh Thread 1: Fatal error: Index out of range

например,

  1. delete 1 -> 2 -> 3 получает cra sh
  2. delete 2 -> 1 получает cra sh
  3. delete 3 получает cra sh

если закомментировать часть текстового поля, нет cra sh. не совсем уверен, что происходит ...

struct ContentView: View {
    @State var strs = ["1", "2", "3"]
    @State var showingDetail: Bool = false
    var body: some View {
        List {
            ForEach(Array(strs.enumerated()), id: \.element) { index, str in
                VStack {
                    Button(action: {
                        self.showingDetail.toggle()
                    }) {
                        Text("show modal")
                            .sheet(isPresented: self.$showingDetail) {
                                ModalView(showingDetail: self.$showingDetail, strs:self.$strs,
                                          index: index)
                        }
                        TextField("", text:self.$strs[index])
                    }
                }
            }
        }
    }
}

struct ModalView: View {
    @Binding var showingDetail: Bool
    @Binding var strs: [String]
    var index: Int = 0
    var body: some View {
        Button(action: {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                self.strs.remove(at: self.index)
            }
            self.showingDetail.toggle()
        }) {
            Text("delete")
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Проблема связана с просмотром порядка обновления. Вместо этого используйте следующий вариант для TextField

TextField("", text: Binding(get: { self.strs[index] },
                            set: { self.strs[index] = $0 }))
0 голосов
/ 21 июня 2020

Когда вы удаляете элемент в массиве, количество элементов в массиве уменьшается. Итак, когда вы удаляете первый элемент ie., Индекс 0, то остается только 2. Теперь вы можете удалить элемент с индексом 1, который является последним элементом, и в массиве останется только 1 элемент с индексом 0. Поэтому, когда вы пытаетесь получить доступ к третьему элементу с индексом 2, вы получаете ошибку sh. Если вы хотите удалять элементы последовательно, то удаляйте по индексу 0, пока массив не станет пустым. Таким образом, вы должны удалить 0 -> 0 -> 0, если в массиве 3 элемента.

...