Код SwiftUI назначает один объект данных всем другим объектам в массиве? - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь создать приложение для заметок, и в настоящее время я работаю на экране, где пользователь может вводить карточки для заметок. Все работает нормально, за исключением того, что когда я ввожу свой термин и определение для одной карты заметок, он обновляет все другие карты, чтобы они имели одинаковые термин и определение. Большое спасибо за любую помощь, это ценится! :)

Here is a preview of my code

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()
    }
}

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Когда вам требуется Binding в ForEach l oop, вам нужно l oop через индексы, а не элементы.

Обновлен Notecard с помощью term2 и def2 изменяемый.

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

Обновлен ContentView путем изменения ForEach l oop.

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)
    }
}
0 голосов
/ 10 апреля 2020

Я думаю, проблема в том, что здесь вы передаете переменные состояния self.$term и self.$def, в которых они являются dfs и df. Вместо этого вы должны использовать item.term2 и 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 struct в ваших примерах, но если она требует привязки данных, вам нужно будет указать def2 и term2 как @State, а также сделать их var вместо let. Поскольку теперь они будут отправлены в другие представления в качестве государства, вам также понадобится $, указывающий привязку данных. Я внес изменения в вышеуказанный код.

Модифицированный код:

struct Notecard: Identifiable
{
    let id = UUID()
    @State var term2: String
    @State var def2: String
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...