Hello, I am a newbie, I am working on 100days of swift. I do not get any errors. I am trying to display words on my list and save them. I am working on a flashcard app. I have 3 files, two of them are views.
My model
import Foundation
import SwiftUI
struct Knowledge: Identifiable,Codable {
var id = UUID()
var term: String
var explanation: String?
var tags: String?
}
class Deck: ObservableObject {
@Published var knowledgeArray = [Knowledge]()
init() {
if let savedItems = UserDefaults.standard.data(forKey: "KnowledgeItems") {
if let decodedItems = try? JSONDecoder().decode([Knowledge].self, from: savedItems) {
knowledgeArray = decodedItems
return
}
}
knowledgeArray = []
}
}
my second view that makes adds terms.
import SwiftUI
import Foundation
struct addCard: View {
@Environment(\.presentationMode) var presentationMode
@Environment(\.dismiss) var dismiss
@State private var terms = ""
@State private var tags = ""
@State private var explanations = ""
@StateObject var KN: Deck
var body: some View {
VStack {
Form {
TextField("Term", text: $terms)
TextField("Explanation", text: $explanations)
TextField("Tag", text: $tags)
}
Button("Save") {
let item = Knowledge(term: terms, explanation: explanations , tags: tags)
KN.knowledgeArray.append(item)
self.presentationMode.wrappedValue.dismiss()
print("Button is working")
}
.padding()
}
}
}
and my final list view
import SwiftUI
struct cardList: View {
@ObservedObject var decks = Deck()
@State private var showingaddCard = false
var body: some View {
NavigationView {
List {
ForEach(decks.knowledgeArray) { cardName in
Text(cardName.term)
.font(.title)
}
.onDelete(perform: removeItems)
}
.toolbar {
Button {
showingaddCard = true
} label: {
Image(systemName: "plus")
}
}
.navigationTitle("Card List")
}
.sheet(isPresented: $showingaddCard) {
addCard(KN: Deck())
}
}
func removeItems(at offsets: IndexSet) {
decks.knowledgeArray.remove(atOffsets: offsets)
}
}
Any advice is appreciated.
You misused Environment Object.
This should work:
struct Knowledge: Identifiable, Codable {
var id = UUID()
var term: String
var explanation: String?
var tags: String?
}
class Deck: ObservableObject {
@Published var knowledgeArray : [Knowledge] = []
init() {
if let savedItems = UserDefaults.standard.data(forKey: "KnowledgeItems") {
if let decodedItems = try? JSONDecoder().decode([Knowledge].self, from: savedItems) {
knowledgeArray = decodedItems
return
}
}
knowledgeArray = []
}
}
struct AddCard: View {
@Environment(\.presentationMode) var presentationMode
@Environment(\.dismiss) var dismiss
@State private var terms = ""
@State private var tags = ""
@State private var explanations = ""
// @StateObject
@EnvironmentObject var KN: Deck
var body: some View {
VStack {
Form {
TextField("Term", text: $terms)
TextField("Explanation", text: $explanations)
TextField("Tag", text: $tags)
}
Button("Save") {
let item = Knowledge(term: terms, explanation: explanations , tags: tags)
KN.knowledgeArray.append(item)
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(KN.knowledgeArray) {
let defaults = UserDefaults.standard
defaults.set(encoded, forKey: "KnowledgeItems")
}
self.presentationMode.wrappedValue.dismiss()
print("Button is working")
}
.padding()
}
}
}
struct cardList: View {
@ObservedObject var decks = Deck()
@State private var showingaddCard = false
var body: some View {
NavigationView {
List {
ForEach(decks.knowledgeArray) { cardName in
Text(cardName.term)
.font(.title)
}
.onDelete(perform: removeItems)
}
.toolbar {
Button {
showingaddCard = true
} label: {
Image(systemName: "plus")
}
}
.navigationTitle("Card List")
}
.sheet(isPresented: $showingaddCard) {
AddCard().environmentObject(decks)
}
}
func removeItems(at offsets: IndexSet) {
decks.knowledgeArray.remove(atOffsets: offsets)
}
}