如何在swiftUI列表中更改复杂的数据源 [英] How to change complex data source in swiftUI List
问题描述
当我更改数据源时,例如在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
}))
}
}
}
}
}
为什么?有人帮我吗?
推荐答案
说
该集合不能为空.
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屋!