본문 바로가기

프로젝트/ReminderApp clone

(7)
08. 새 Entity 추가, 의존성 추가 List 아래에 저장 될 Reminder Entity를 생성한다. 저장되는 데이터들은 위와 같고, 특별히 유별난 데이터를 저장할 것이 아니기때문에 Codegen도 Class Definition 그대로 둔다. 이제 이 둘을 연결해서 의존성을 부여해야 한다. MyList의 list(Inverse)들은 각각 reminder(Destination = Reminder)를 갖게 된다. 그리고 이들은 다수다. (To Many) Reminder의 reminder(inverse)들은 각각 하나씩의 list(Destination = MyList)를 갖게 된다. 이들은 하나다. (To One) 최종적으로는 위와 같은 형태로 relation이 완성된다. MyList는 Reminder로 연결되고, 여러개를 소유할 수 있으므로 ..
07. 기능개선 #1 (공백 예외처리하기) ToolbarItem(placement: .topBarTrailing) { Button("Done") { // TODO: save function onSave(name, UIColor(selectedColor)) dismiss() } .disabled(!isFormValid) } List의 name은 optional 속성이 아니고, 공백인 상태로 저장을 시도하면 오류가 발생하게 된다. private var isFormValid: Bool { !name.isEmpty } 이를 위해 저장을 시도하게 되는 Done 버튼은 name에 해당하는 textField가 비어있다면 비활성화되도록 구성했는데 공백에는 무력화 되는 문제가 생긴다. extension String { var isEmptyOrWhitespace:..
06. ListView 구성하기, Preview Data 구성하기 지금은 데이터가 CoreData에 잘 저장되는지 확인하기 위한 임시 출력하고 있을 뿐, 어떤 동작도 하지 않고, 모든 데이터를 포함하고 있지도 않다. 폴더 기능까지는 그렇다 치더라도 아이콘과 이름 등을 알맞게 표시하면 좋을 것 같다. // // MyListCellView.swift // ReminderApp // import SwiftUI struct MyListCellView: View { let myList: MyList var body: some View { HStack { Image(systemName: "line.3.horizontal.circle.fill") .foregroundColor(Color(myList.color)) Text(myList.name) Spacer() Image(syste..
04. 저장 기능 구현하기 이제 생성한 List를 CoreData에 저장해야 한다. MyList의 clolor attribute는 지원하지 않는 타입의 데이터를 저장하기 휘애 Transformable로 설정돼있고, 형변환을 위해 transformer가 필요하다. // // UIColorTransformer.swift // ReminderApp // import Foundation import UIKit class UIColorTransformer: ValueTransformer { override func transformedValue(_ value: Any?) -> Any? { guard let color = value as? UIColor else { return nil } do { let data = try NSKeyedAr..
03. AddNewListView 수정 및 호출 // // ContentView.swift // ReminderApp // import SwiftUI struct HomeView: View { @State private var isPresented: Bool = false var body: some View { NavigationStack { VStack { Text("Hello World") Button { isPresented = true } label: { Text("Add List") .frame(maxWidth: .infinity, alignment: .trailing) .font(.headline) } .padding() } .sheet(isPresented: $isPresented, content: { NavigationStack { Ad..
02. 새 List 추가 인터페이스 구현하기 DB에 새로운 List를 추가하기 위해 List를 추가하는 인터페이스를 작성한다. 애플의 Reminder와는 일단은 다르지만 기본적인 기능을 수행할 수 있도록 최소한으로 작성했다. // // ColorPickerView.swift // ReminderApp // import SwiftUI struct ColorPickerView: View { @Binding var selectedColor: Color let colors: [Color] = [.red, .green, .blue, .yellow, .orange, .purple] var body: some View { HStack { ForEach(colors, id: \.self) { color in ZStack { Circle().fill() .fore..
01. CoreData 설계(01) Reminder 앱을 위한 데이터로는 List와 Reminder가 존재한다. 이번엔 List를 위한 Entity를 설계하고, 이를 앱에서 사용할 수 있도록 Implement 한다. Entity 이름은 MyList이고, color와 name이라는 Attribute를 갖는다. color의 타입으로 사용할 UIColor는 CoreData에서 기본적으로 지원하지 않는 타입이기 때문에 직접 지정과 변환을 진행해 줘야 한다. 이를 위해 Codegen 설정을 Manual로 바꿔주고 color attribute의 타입을 Transformable로 설정하고, Transformer와 Custom Class를 직접 지정한다. // // MyList+CoreDataClass.swift // ReminderApp // impo..