【问题标题】:How to change complex data source in swiftUI List如何在 swiftUI 列表中更改复杂数据源
【发布时间】:2020-07-05 06:25:32
【问题描述】:

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

控制台日志:

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

致命错误:索引超出范围:文件 /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.8.25.8/swift/stdlib/public/core/ContiguousArrayBuffer.swift, 第 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
                    }))
                }
            }
        }
    }
}

为什么?有人帮帮我吗?

【问题讨论】:

    标签: ios binding swiftui optional swiftui-list


    【解决方案1】:

    removeFirst()

    它说

    集合不能为空。

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

    【讨论】:

    • 我很确定收藏不是空的。我已经检查过很多次了。如果你仔细看你会发现有三个闭包来执行删除项目数据。但这一切都会导致崩溃。估计是和swiftUI List数据缓存有关?
    • indices.forEach {self.parameters.remove(at: $0)} 会崩溃,因为删除元素会使索引无效。
    • 需要更多信息,例如;如何添加元素,如何验证它是否为空,是否在其他地方捕获了集合......等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多