SwiftUI List аварийно завершает работу при удалении выбранного элемента

У меня серьезная проблема с представлением списка SwiftUI в Xcode 12 (бета) (приложение MacOS).

Когда выбранный элемент списка удаляется, список каждый раз вылетает из строя.

[Общие] Строка 2 вне диапазона строк [0–1] для rowViewAtRow: createIfNeeded:

Мне кажется, что это ошибка в SwiftUI. Что я могу сделать, чтобы предотвратить сбой? Я уже пробовал несколько вещей, но безуспешно.

Пример кода:

//
// Example to reproduce bug
// * Select no item or other than last item and press button: selection is reset, last item is removed, no crash
// * Select last list item and press button "Delete last item" => Crash
//

import SwiftUI

class MyContent: ObservableObject {
    @Published var items: [String] = []
    @Published var selection: Set<String> = Set()
    
    init() {
        for i in 1...5 {
            self.items.append(String(i))
        }
    }
}

struct MyView: View {
    @ObservedObject var content: MyContent = MyContent()
    
    var body: some View {
        VStack {
            List(content.items, id: \.self, selection: $content.selection) {
                item in
                Text("\(item)")
            }
            
            Button("Delete last item", action: {
                if content.items.count > 0 {
                    content.selection = Set()  // reset selection
                    var newItems = Array(content.items)
                    newItems.removeLast()
                    content.items = newItems
                }
            })
        }
    }
}

person ikemuc    schedule 12.09.2020    source источник
comment
Нет сбоев с Xcode 11.7 / macOS 10.15.6. На всякий случай.   -  person Asperi    schedule 12.09.2020
comment
Для воспроизведения вы должны выбрать последний элемент в списке и нажать кнопку удаления. В моем окружении он гарантированно вылетел из строя. Я использую Xcode 12 beta6 на Mac Book Air с последней бета-версией MacOS Big Sur (сборка 20A5364e).   -  person ikemuc    schedule 12.09.2020
comment
Сделал еще одну проверку: я создал новый, чистый проект приложения MacOS в Xcode, поместил пример кода в ContentView.swift и обменял ContentView () в приложении на MyView (). Затем выберите профиль сборки MacOS и начните. После этого выберите последнюю запись и нажмите кнопку «Удалить» и «Бум», произойдет сбой ...   -  person ikemuc    schedule 12.09.2020
comment
Выполнил 2 проверки: 1. MacOS 11 beta (20A5364e) + Xcode 11.7 = ›Сбой 2. MacOS 10.15.6 + Xcode 11.7 =› без сбоев Ошибка явно присутствует в MacOS 11 beta ... Спасибо за помощь, даже если есть решения пока нет, но теперь ясно, что это не моя вина ... :-)   -  person ikemuc    schedule 13.09.2020
comment
Отправлен отчет об ошибке Apple (FB8680646) ...   -  person ikemuc    schedule 13.09.2020


Ответы (1)


Повторно протестировано после установки MacOS 11.0 Beta 7 (20A5374g). Код примера больше не вылетает, ошибка вроде исправлена.

Спасибо всем за тестирование и подсказку, что это ошибка бета-версии MacOS. :-)

person ikemuc    schedule 21.09.2020