Post

Replies

Boosts

Views

Activity

SwiftUI List with children crashes when the last item is deleted
Hello, I narrowed down the problem and created a clean project. The code is below. I found similar issue on forum, it was fixed there eventually for a regular list. However it wasn't fixed for a list with children. Reproduces 100% of time, faced on macOS 11.1, I'm on "11.2 Beta (20D5029f)" currently. Xcode Version 12.3 (12C33) Run the project, click the remove button 3 times - it crashes. Try and remove "children" part of the list, it stops crashing. The crash happens at SwiftUI`SwiftUI.OutlineListUpdater.init(base: SwiftUI.ListStyleDataSource<A>) -> SwiftUI.OutlineListUpdater<A>: Are there any temporary workarounds? import SwiftUI struct Item: Identifiable {   let id: UUID   let name: String   let children: [Item]?       init(id: UUID = UUID(), name: String = String(UUID().uuidString.prefix(6)), children: [Item]? = nil) {     self.id = id     self.name = name     self.children = children   } } class ViewModel: ObservableObject {       @Published var items: [Item] = ViewModel.generateRandom()       func removeLast() {     var itemsCopy = items     itemsCopy.removeLast()     items = itemsCopy   }       func generateNew() {     items = ViewModel.generateRandom()   }       static func generateRandom() -> [Item] {     [       .init(children: [.init(), .init()]),       .init(children: [.init(), .init()]),       .init(children: [.init(), .init()]),     ]   } } struct ContentView: View {       @StateObject var viewModel: ViewModel = ViewModel()       var body: some View {           VStack {       List(viewModel.items, id: \.id, children: \.children) { item in         VStack {           Text(item.name).padding()           Divider()         }       }               Button("generate new") {         viewModel.generateNew()       }               Button("remove last") {         viewModel.removeLast()       }     }   } }
5
0
1.6k
Jan ’21
List with children on macOS 11.0 renders wrong data
I need to display the following data as a list with groups Item 00 Item 01 &#9;&#9;- Item 10 &#9;&#9;&#9;&#9; - Item 20 &#9;&#9;&#9;&#9; - Item 21 &#9;&#9;- Item 11 Item 02 However if Item 10 is collapsed Item 11 is shown as Item 02. What am I doing wrong? Unique IDs are set. You can see it clearly on screenshots: Corrupted https://github.com/kmalyshev/ListProblemExample/blob/main/images/Screenshot1.png Correct https://github.com/kmalyshev/ListProblemExample/blob/main/images/Screenshot2.png The code: import SwiftUI struct ContentView: View {       let data = Item.getSampleData()       var body: some View {     List(data, id: \.id, children: \.children) { item in       Text(item.name)     }.listStyle(SidebarListStyle())   } } struct ContentView_Previews: PreviewProvider {   static var previews: some View {     ContentView()   } } struct Item: Codable {       let id: UUID   let name: String   let children: [Item]?       init(id: UUID = UUID(), name: String, children: [Item]? = nil) {     self.id = id     self.name = name     self.children = children   }       static func getSampleData() -> [Item] {     [       Item(name: "Item 00"),       Item(         name: "Item 01",         children: [           Item(             name: "Item 10",             children: [               Item(name: "Item 20"),               Item(name: "Item 21"),             ]           ),           Item(name: "Item 11"),         ]       ),       Item(name: "Item 02"),     ]   }     } I created a sample project that shows the problem. https://github.com/kmalyshev/ListProblemExample I tried it on macOS 11.0.1 and 11.1 Beta Updated Xcode to 12.3 - same result. OutlineGroup and List with ForEach using recursive view give the same result. Any help is appreciated.
3
0
662
Dec ’20