Сбой списка SwiftUI при удалении выбранного элемента

#swiftui #swiftui-list #xcode12beta6

#swiftui #swiftui-список #xcode12beta6

Вопрос:

У меня серьезная проблема с представлением списка 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
                }
            })
        }
    }
}
  

Комментарии:

1. Нет сбоя с Xcode 11.7 / macOS 10.15.6. На всякий случай.

2. Для воспроизведения вам нужно выбрать последний элемент в списке и нажать кнопку удаления. В моей среде он разбился на 100%. Я использую Xcode 12 beta6 на Mac Book Air под управлением последней бета-версии macOS Big Sur (сборка 20A5364e).

3. Выполнил еще одну проверку: я создал новый, чистый проект приложения macOS в Xcode, поместил пример кода в contentView.swift и заменил contentView () в приложении MyView(). Затем выберите создать профиль macOS и запустите. После этого выберите последнюю запись и нажмите кнопку удаления, и Бум, она вылетает…

4. Теперь выполнил 2 проверки: 1. macOS 11 beta (20A5364e) Xcode 11.7 => Сбой 2. macOS 10.15.6 Xcode 11.7 => сбоя нет Ошибка явно в macOS 11 beta… Спасибо за помощь, даже когда решения еще нет, но теперь ясно, что это не моя вина … 🙂

5. Отправлено сообщение об ошибке Apple (FB8680646)…

Ответ №1:

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

Спасибо всем за тестирование и за то, что дали мне подсказку, что это ошибка бета-версии macOS. 🙂