0

我正在尝试构建一个记事卡应用程序,目前我正在用户可以输入记事卡的屏幕上工作。一切正常,除了当我为一张记事卡输入术语和定义时,它会更新所有其他记事卡,使它们具有相同的术语和定义。非常感谢您的帮助,不胜感激!:)

这是我的代码的预览

import SwiftUI

struct Notecard: Identifiable
{
    let id = UUID()
    let term2: String
    let def2: String
}
class Notecards: ObservableObject
{
   @Published var Notecardsarray = [Notecard]() //stores an array of the notecard items into a single object
}
struct ContentView: View{
    @ObservedObject var notecardobject = Notecards()
    @State private var term = "dfs"
    @State private var def = "df"

    var body: some View {
        NavigationView{
        List{
            ForEach(notecardobject.Notecardsarray){item in
                HStack{
                    TextField("enter term", text: self.$term)
                    TextField("enter definition", text: self.$def)
                }
            }
            .onDelete(perform: removeItems)
        }
    .navigationBarTitle("Notecards")
      .navigationBarItems(trailing:
          Button(action: {
            let newnotecard = Notecard(term2: self.term, def2: self.def)
              self.notecardobject.Notecardsarray.append(newnotecard)
          }) {
              Image(systemName: "plus")
          }
      )
        }

    }
   func removeItems(at offsets: IndexSet) {
       notecardobject.Notecardsarray.remove(atOffsets: offsets)
   }
}
//this will not actually be part of the app that goes to app store
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
4

2 回答 2

0

我认为问题在于,就在这里,您正在传递状态变量self.$termself.$def它们是 dfs 和 df。相反,您应该使用item.term2and ,item.def2因为它在您的ForEach

List{
    ForEach(notecardobject.Notecardsarray){item in
        HStack{
            TextField("enter term", text: self.$term)
            TextField("enter definition", text: self.$def)
        }
    }
    .onDelete(perform: removeItems)
}

修改代码:

 List{
    ForEach(notecardobject.Notecardsarray){item in
        HStack{
            TextField("enter term", text: item.$term2)
            TextField("enter definition", text: item.$def2)
        }
    }
    .onDelete(perform: removeItems)
}

编辑:我TextView在您的示例中看不到结构,但如果它需要数据绑定,您将需要指定def2andterm2以及@State制作它们var而不是let. 因为它们现在将作为状态发送到其他视图,所以您还需要指示数据绑定的 $。我对上面的代码进行了编辑。

修改后的代码:

struct Notecard: Identifiable
{
    let id = UUID()
    @State var term2: String
    @State var def2: String
}
于 2020-04-09T21:26:14.697 回答
0

当您需要Binding循环ForEach时,您需要遍历索引而不是元素。

Notecard通过 maketerm2def2mutable更新。

struct Notecard: Identifiable {
    let id = UUID()
    var term2: String
    var def2: String
}

ContentView通过更改ForEach循环进行更新。

ForEach(notecardobject.Notecardsarray.indices, id: \.self){ index in
    HStack{
        TextField("enter term", text: self.$notecardobject.Notecardsarray[index].term2)
        TextField("enter definition", text: self.$notecardobject.Notecardsarray[index].def2)
    }
}
于 2020-04-09T21:34:29.377 回答