如何在swiftUI列表中更改复杂的数据源 [英] How to change complex data source in swiftUI List

查看:222
本文介绍了如何在swiftUI列表中更改复杂的数据源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我更改数据源时,例如在APIView中点击更改数据"按钮或在QueryParametersView.list中删除项目时,应用崩溃

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

控制台日志:

此类"SwiftUI.AccessibilityNode"不是已知的可序列化的 元素并将其作为可访问性元素返回可能会导致 崩溃

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

致命错误:索引超出范围:文件 /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.8.25.8/swift/stdlib/public/core/ContiguousArrayBuffer.swift, 444行

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
                    }))
                }
            }
        }
    }
}

为什么?有人帮我吗?

推荐答案

removeFirst ()

该集合不能为空.

The collection must not be empty.

如果在调用removeFirst时集合为空,则应用程序崩溃,索引超出范围.

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

这篇关于如何在swiftUI列表中更改复杂的数据源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆