ave marina
ave marina

Reputation: 21

How to change complex data source in swiftUI List

App crash when I change data source like I tap “change data” button in APIView or delete item in QueryParametersView.list

console log:

This class 'SwiftUI.AccessibilityNode' is not a known serializable element and returning it as an accessibility element may lead to crashes

Fatal error: Index out of range: file /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.8.25.8/swift/stdlib/public/core/ContiguousArrayBuffer.swift, line 444

class URLComponentsModel: ObservableObject {
    @Published var urlComponents = URLComponents.init()
    var urlQueryItems: [URLQueryItem] {
        get {
            urlComponents.queryItems ?? [URLQueryItem].init()
        }
        set {
            urlComponents.queryItems = newValue
        }
    }
}

struct APIView: View {
    @ObservedObject var urlComponentsModel = URLComponentsModel.init()
    var body: some View {
        Button.init("change data") {
            self.urlComponentsModel.urlComponents.queryItems?.removeFirst()
        }
        QueryParametersView.init(parameters: self.$urlComponentsModel.urlQueryItems)
    }
}

struct QueryParametersView: View {
    @Binding var parameters: [URLQueryItem]
    
    var body: some View {
        List {
            ForEach(self.parameters.indices, id: \.self) { i in
                    HStack {
                        ParameterView.init(urlQueryItem: self.$parameters[i])
                        Text.init("delete")
                            .onTapGesture {
                                self.parameters.remove(at: i)
                        }
                    }
            }
                .onDelete { indices in
                    indices.forEach {
                        self.parameters.remove(at: $0)
                }
        }
    }
}

struct ParameterView: View {
    @Binding var urlQueryItem: URLQueryItem
    var body: some View {
        ZStack {
            ...
            HStack {
                ...
                if self.urlQueryItem.value != nil {
                    TextField("Value", text: Binding.init(get: {
                        (self.urlQueryItem.value ?? "")
                    }, set: { (value) in
                        self.urlQueryItem.value = value
                    }))
                }
            }
        }
    }
}

why? anybody help me?

Upvotes: 1

Views: 428

Answers (1)

Jim lai
Jim lai

Reputation: 1409

removeFirst()

It says

The collection must not be empty.

If the collection is empty when you call removeFirst, app crashes with index out of range.

Upvotes: 1

Related Questions