ios 无法访问swiftui中布尔状态数组的元素

nnsrf1az  于 2023-08-08  发布在  iOS
关注(0)|答案(1)|浏览(92)

我有一个结构如下

struct ValidStruct : Identifiable{
    var id: UUID
    var isValid = true
}

字符串
然后,我有一个视图,它有一个 State 属性,该属性是ValidStruct的数组

struct ValidityDetailView: View {
    @State var isValidCollection: [ValidStruct] = []


在这个视图中,有些地方我有类似于下面代码

var body: some View {
  ScrollView{
            LazyVStack{
                let elt = detail["validObjects"] as! OrderedDictionary<String, Any>?

                ForEach(0..<elt!.count){ index in

                            HStack{
                                    Text("\(isValidCollection[index].isValid) ? "Not valid" : "Valid")")
                                        .font(.title2)
                                        .onTapGesture {
                                            isValidCollection[index].isValid.toggle()
                                        }
...
}
}
}
}.onAppear{
  //initialize and populate isValidCollection array here
        let elt = detail["validObjects"] as! OrderedDictionary<String, Any>?
        isValidCollection = Array(repeating: ValidStruct(id: UUID(), isValid: false), count: elt!.count)
        print(">>> isValidCollection count \($isValidCollection.count)")
}
}


上面的代码使预览崩溃。请问我做错了什么?
期望看到由垂直行的文本ui元素填充的预览

xkrw2x1b

xkrw2x1b1#

首先强制将可选的向下转换为可选的

let elt = detail["validObjects"] as! OrderedDictionary<String, Any>?

字符串
是毫无意义的。

  • 如果要进行条件向下转换,请将感叹号替换为问号,并删除结尾处的问号。
  • 如果要强制向下转换,则可删除问号。

发生此错误的原因是,当第一次呈现视图时,isValidCollection为空,但ForEach中的elt!.count具有值,因此您会发生越界崩溃。请改为使用isValidCollection.count并删除let elt = …

var body: some View {
    ScrollView{
        LazyVStack{
            ForEach(0..<isValidCollection.count){ index in
                HStack {
                    Text(isValidCollection[index].isValid ? "Not valid" : "Valid")
                       .font(.title2)
                       .onTapGesture {
                            isValidCollection[index].isValid.toggle()
                       }
...
}


其他注意事项:

  • isExpanded更可能是isValid。“
  • 不要在“字符串插值”中使用三元运算符。
  • id声明为常量并将isValid声明为false会更有效,因为这似乎是默认值
struct ValidStruct : Identifiable {
      let id = UUID()
      var isValid = false
  }


然后可以初始化数组

isValidCollection = Array(repeating: ValidStruct(), count: elt!.count)

相关问题