본문 바로가기
Swift

[iOS] SwiftData를 활용한 간단한 Todo 어플리케이션 만들어 보기

by 마라민초닭발로제 2024. 6. 2.

SwiftData를 활용해서 TODO 어플리케이션을 만들어 봤습니다. 

 

CoreData를 활용하기 위해서는

1. modelContainer Modifier를 통해 필요한 Model들을 선언 

2. 필요 Model을 저장

3. modelContext를 활용한 데이터 활용

 

struct TIL_SwiftDataApp: App {
  var body: some Scene {
    WindowGroup {
      ContentView()
    }
    .modelContainer(for: [Todo.self])
  }
}


//
//  ContentView.swift
//  TIL_SwiftData
//
//  Created by MaraMincho on 6/2/24.
//

import SwiftUI
import SwiftData

struct ContentView: View {
  
  @Query var todos: [Todo]
  @Environment(\.modelContext) private var modelContext
  @State var someText: String = ""
  var body: some View {
    
    NavigationStack {
      VStack {
        NavigationLink(value: Todo(title: "", todoContent: "")) {
          Text("add todo")
        }

        List {
          ForEach(todos) { todo in
            NavigationLink(value: todo) {
              Text(todo.title)
            }
          }
        }
      }
      .navigationTitle("TODOS")
      .navigationDestination(for: Todo.self) { todo in
        TodoView(todoElement: todo)
      }
    }
    .onAppear{
    }
  }
}

@Model
final class Todo {
  var title: String
  var todoContent: String
  
  init(title: String, todoContent: String) {
    self.title = title
    self.todoContent = todoContent
  }
}

struct TodoView: View {
  var todoElement: Todo
  @State var contentTextFieldText: String
  @State var titleTextFieldText: String
  @Environment(\.modelContext) private var modelContext
  init(todoElement: Todo) {
    self.todoElement = todoElement
    contentTextFieldText = todoElement.todoContent
    titleTextFieldText = todoElement.title
  }
  
  @Environment(\.dismiss) var dismiss
  var body: some View {
    VStack {
      HStack {
        Button {
          
          todoElement.title = titleTextFieldText
          todoElement.todoContent = contentTextFieldText
          modelContext.insert(todoElement)
          dismiss()
        } label: {
          Text("저장")
        }
        
        Button {
          modelContext.delete(todoElement)
          dismiss()
        } label: {
          Text("제거")
        }
      }
   

      TextField("", text: $titleTextFieldText, axis: .vertical)
        .background(Color.gray.opacity(0.8))
        .padding()
      
      TextField("", text: $contentTextFieldText, axis: .vertical)
        .padding()
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color.gray.opacity(0.5))
        .font(.largeTitle)
      Spacer()
    }
  }
}

 

 

 

레퍼런스

https://medium.com/daily-monster/swiftdata란-무엇일까-dfbba1670f10

https://www.appcoda.com/swiftdata/