Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 迅捷';当数组';s元素被删除_Swift_Swiftui - Fatal编程技术网

Swift 迅捷';当数组';s元素被删除

Swift 迅捷';当数组';s元素被删除,swift,swiftui,Swift,Swiftui,我尝试将UI元素按行排列—一行中有两个元素,为此我使用两个ForEach,一个用于行,一个用于行中的元素。每个UI元素都有@Binding,因此我从模型的数组中传递一个结构。我应该能够动态添加或删除元素,除了一件事之外,其他一切都可以正常工作-当我从一行中删除唯一的元素时,我的应用程序会崩溃,出现错误致命错误:索引超出范围:文件Swift/contiguousarrarybuffer.Swift,第444行。我已经读了好几个关于SO的话题,但还没有找到答案 我的代码是这样的: struct Pi

我尝试将UI元素按行排列—一行中有两个元素,为此我使用两个
ForEach
,一个用于行,一个用于行中的元素。每个UI元素都有
@Binding
,因此我从模型的数组中传递一个结构。我应该能够动态添加或删除元素,除了一件事之外,其他一切都可以正常工作-当我从一行中删除唯一的元素时,我的应用程序会崩溃,出现错误
致命错误:索引超出范围:文件Swift/contiguousarrarybuffer.Swift,第444行
。我已经读了好几个关于SO的话题,但还没有找到答案

我的代码是这样的:

struct PickerElement:可散列{
让id:Int
标题:字符串
let值:Int
}
struct-CellModel:Hashable{
var元素:PickerElement?
变量错误:字符串?
}
struct PickerButton:视图{
@绑定var值:CellModel?
@绑定变量错误:字符串?
(...)
}
类MyModel:ObservableObject{
@已发布变量计数器=0
@已发布的变量cellModels=[CellModel]()
private var cancelables=Set()
$counter.sink{中的值
设diff=value-self.cellModels.count
如果差异>0{
self.cellModels.append(内容:
数组(重复:CellModel(),计数:diff)
)
}如果差值小于0,则为else{
self.cellModels=数组(
self.cellModels.prefix(值)
)
}
}.store(在:&可取消项中)
}
struct MyView:View{
@观察对象var模型:MyModel
var body:一些观点{
VStack(间距:8){
布局元素()
}
}
@视图生成器
func layOutElements()->某些视图{
让elementscont=model.cellModels.count
如果ElementScont>0{
VStack{
HStack{
垫片()
文本(“某些标题”).font(.caption)
垫片()
}.padding()
//计算行数
设rowscont=Int(cell(Double(elementscont)/2.0))
//排成一行
ForEach(0..
@ViewBuilder
private func layOutRow(rowIndex:Int,elementsCount:Int,rowsCount:Int)->一些视图{
HStack(对齐:顶部,间距:8){
设firstCellInRowIndex=rowIndex*2
设lastCellInRowIndex=min(ElementScont-1,firstCellInRowIndex+1)
ForEach(firstCellInRowIndex…lastCellInRowIndex,id:\.self){elementIndex in

PickerButton(值:$model.cellModels[elementIndex].element,//当
layOutElements()
中的
elementsCount
变为0时,会发生崩溃。然后
layOutElements()
不会返回视图,这应该是不可能的。您可以在if语句中添加一个else,返回EmptyView()或某个占位符


除此之外,根据我的经验,使用动态范围的ForEach非常混乱。如果需要索引,可以使用Array.enumerated()这给了我更好的结果。

谢谢你的回答。即使
elementsCount
大于0,我的应用程序也会崩溃。正如我所说,
ForEach
es和代码计算索引工作正常,问题在于嵌套的
ForEach
中的绑定在其他
ForEach
if
中。例如,如果我将
PickerButton(值:$model.cellModels[elementIndex]。元素,错误:$model.cellModels[elementIndex]。错误)
更改为
PickerButton(值:$v,错误:$e)
并添加虚拟状态
@State var v=CellModel()
@State var e=“”
,代码将不会出现任何问题。我刚刚注意到,如果我从
layOutRow(rowIndex:Int,ElementScont:Int,RowScont:Int)->某些视图中删除
HStack(对齐:.top,间距:8)
,代码不会崩溃(当然,不会在网格中布局我的元素)。