본문 바로가기

Swift

(42)
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..
05. CoreData Fetch 구현하기 이전까지의 작업으로 데이터 저장은 잘 되지만 이를 확인할 방법이 없다. (솔직히 확인이 안 되니 잘 되는지도 모른다.) 확인할 수 있도록 간단한 UI와 Fetch 기능을 구현해 결과를 확인해 보도록 하자. // // ContentView.swift // ReminderApp // import SwiftUI struct HomeView: View { @FetchRequest(sortDescriptors: []) private var myListResults: FetchedResults @State private var isPresented: Bool = false var body: some View { NavigationStack { VStack { List(myListResults) { list in T..
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..
00. 시작하며 시작하며 최근 앱들을 여럿 스토어에 등록했는데 슬슬 사용자들이 직접 데이터를 생성하고, 이를 관리할 수 있는 기능들에 대한 아이디어가 많아지고 있다. WWDC 2023을 기준으로 SwiftUI는 새로운 데이터 관리 도구인 SwiftData를 지원하기 시작했고, 이는 기존의 CoreData를 SwiftUI의 스타일에 맞도록 사용하는 새로운 패러다임이고 익숙해져야만 한다. 이를 위해 당분간은 CoreData를 기반으로 한 프로젝트들을 위주로 공부를 진행하고, SwiftData를 배워보면서 부족했던 부분을 채우고, 한 발 더 나아가는 기회로 삼고자 한다. 앱 Swift Swift - Apple Developer Swift is a powerful and intuitive programming language ..
05. 인터페이스 디자인 #2 인터페이스 디자인 #2 앱 설정, 디자인 다듬기 앱 설정 기기의 모든 상태에 대처할 수 있다면 더할 나위 없이 좋겠지만, 가진이 없다면 예상이 되는 상황은 미리 차단하는 것도 방법이다. 앱 설정 | 화면 방향 고정하기 인터페이스를 디자인할 때 offset 등의 고정값을 사용하지 않았기 때문에 큰 문제는 없지만, 이렇게 화면의 방향이 바뀌면 서로의 영역을 침범하는 문제가 생긴다. 따라서 이 앱에서는 Portrait 모드만 지원하도록 앱의 Deployment Info를 변경한다. 이제부터 이 앱은 iPhone의 Portrait 모드 상태로만 제공된다. 앱 설정 | 화면 모드 고정하기 애플은 iOS13부터 darkmode를 지원하기 시작했다. 기본으로 제공하는 API에는 대비가 돼있어 크게 신경 쓸 부분은 없..