简体   繁体   中英

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?

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM