// // ContentView.swift // todos // // Created by Cairocoders // import SwiftUI struct ContentView: View { //User Interface @State private var newTodo = "" @State private var allTodos: [TodoItem] = [] private let todosKey = "todosKey" var body: some View { NavigationView { VStack { //vertical stack HStack { //Horizontal Stack TextField("Add todo...", text: $newTodo) .textFieldStyle(RoundedBorderTextFieldStyle()) Button(action: { guard !self.newTodo.isEmpty else { return } self.allTodos.append(TodoItem(todo: self.newTodo)) self.newTodo = "" self.saveTodos() }) { Image(systemName: "plus") } .padding(.leading, 5) }.padding() //end horizontal stack List { //List view to display all of the to-dos in our allTodos ForEach(allTodos) { todoItem in Text(todoItem.todo) }.onDelete(perform: deleteTodo) } }//end vertical stack .navigationBarTitle("Todos") }.onAppear(perform: loadTodos) } //Storing To-dos in UserDefaults //UserDefaults is a database where you store key-value //https://developer.apple.com/documentation/foundation/userdefaults private func saveTodos() { UserDefaults.standard.set(try? PropertyListEncoder().encode(self.allTodos), forKey: todosKey) } private func loadTodos() { if let todosData = UserDefaults.standard.value(forKey: todosKey) as? Data { if let todosList = try? PropertyListDecoder().decode(Array<TodoItem>.self, from: todosData) { self.allTodos = todosList } } } private func deleteTodo(at offsets: IndexSet) { self.allTodos.remove(atOffsets: offsets) saveTodos() } } //Add codable to make Sure each item encoded and decoded struct TodoItem: Codable, Identifiable { //Identifiable protocol this ensures that the system can distinguish one TodoItem from another var id = UUID() let todo: String } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
article
Tuesday, May 4, 2021
Todo app SwiftUI iOS and UserDefaults database
Todo app SwiftUI iOS and UserDefaults database