在 SwiftUI 中使用模态视图删除列表中的项目时崩溃

Posted

技术标签:

【中文标题】在 SwiftUI 中使用模态视图删除列表中的项目时崩溃【英文标题】:Crashing remove items in list with modal view in SwiftUI 【发布时间】:2020-06-21 01:20:47 【问题描述】:

当尝试从模式视图中删除列表中的项目时,会崩溃Thread 1: Fatal error: Index out of range

例如,

    删除 1 -> 2 -> 3 崩溃 删除 2 -> 1 崩溃 删除 3 会崩溃

如果注释掉文本字段部分,则不会崩溃。不太清楚发生了什么……

struct ContentView: View 
    @State var strs = ["1", "2", "3"]
    @State var showingDetail: Bool = false
    var body: some View 
        List 
            ForEach(Array(strs.enumerated()), id: \.element)  index, str in
                VStack 
                    Button(action: 
                        self.showingDetail.toggle()
                    ) 
                        Text("show modal")
                            .sheet(isPresented: self.$showingDetail) 
                                ModalView(showingDetail: self.$showingDetail, strs:self.$strs,
                                          index: index)
                        
                        TextField("", text:self.$strs[index])
                    
                
            
        
    


struct ModalView: View 
    @Binding var showingDetail: Bool
    @Binding var strs: [String]
    var index: Int = 0
    var body: some View 
        Button(action: 
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) 
                self.strs.remove(at: self.index)
            
            self.showingDetail.toggle()
        ) 
            Text("delete")
        
    


【问题讨论】:

链接***.com/a/63145650/1652402 为我解决了这个问题 【参考方案1】:

当您删除数组中的元素时,数组中的元素数量会减少。所以,当你删除第一个元素,即索引 0 时,只剩下 2 个了。现在您可以删除索引 1 处的元素,该元素是最后一个元素,并且数组在索引 0 处仅剩下 1 个元素。因此,当您尝试访问索引 2 处的第三个元素时,您会崩溃。如果要连续删除元素,则在索引 0 处删除,直到数组为空。因此,如果数组中有 3 个元素,则必须删除 0 -> 0 -> 0。

【讨论】:

【参考方案2】:

问题是由于查看更新顺序。使用以下变体代替TextField

TextField("", text: Binding(get:  self.strs[index] ,
                            set:  self.strs[index] = $0 ))

【讨论】:

以上是关于在 SwiftUI 中使用模态视图删除列表中的项目时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中制作具有透明背景的模态视图?

为啥 SwiftUI 模态视图在此处更新父变量(附代码)

SwiftUI 点击手势阻止列表中的项目删除操作

无法在 SwiftUI 中使用 ForEach 和 CoreData 将数据正确传递给模态演示

SwiftUI:如何从核心数据中的 TextField 中保存值

如何从 SwiftUI 的详细信息视图(编辑项目视图)中删除核心数据条目?