-
내가 필요한 다이어리5Swift/다이어리 2024. 4. 18. 09:08
후.. 다이어리 4탄은 거의 버리면 되는 수준
잘못된 코딩을 하고 있었다랄까? 부분 부분?
일단 여태 한 거 작성해 봅니당
자~ 이런 식으로 만들었는데요?
내 정보 부분만 나중에 만들어 볼 생각입니다^^
좀 알게 된 것(?)은
이전 블로그에서 NavigationLink마다 이렇게
.environment(\.managedObjectContext, persistenceController.container.viewContext)
을 작성했는데
딱 봐도 코드가 길어지고 이상하죠..?
[SwiftUI] EnvironmentObject 주입의 개념과 사용 시 조심할 점
편리한 의존성 주입 API 인 EnvironmentObject 의 개념과 크래시를 예방하기 위해 조심할 점에 대해 알아봅시다.
medium.com
최상위 View에 한 번만 해주면 된다는 사실...
import SwiftUI @main struct DiaryApp: App { let persistenceController = PersistenceController.shared var body: some Scene { WindowGroup { NavigationView { CalendarView() } .environment(\.managedObjectContext, persistenceController.container.viewContext) .accentColor(.hex5E3D25) .onAppear { // 네비게이션 바 외관 설정 let appearance = UINavigationBarAppearance() appearance.titleTextAttributes = [.foregroundColor: UIColor(Color.hex5E3D25)] UINavigationBar.appearance().standardAppearance = appearance // 모든 인스턴스의 표준 외관 설정 UINavigationBar.appearance().scrollEdgeAppearance = appearance // 스크롤 엣지 설정 } } } }
그래서 이렇게 한번만 써주고 다른 곳은 다 지워주기!
추가로 네비게이션 백버튼 색이랑 타이틀 색을 변경하고 싶어서 좀 찾아봤는데
UINavigationBarAppearance클래스의 새로운 인스턴스를 생성해서 설정해야 함
import SwiftUI extension Color { init(hex: String) { let scanner = Scanner(string: hex) _ = scanner.scanString("#") var rgb: UInt64 = 0 scanner.scanHexInt64(&rgb) let r = Double((rgb >> 16) & 0xFF) / 255.0 let g = Double((rgb >> 8) & 0xFF) / 255.0 let b = Double((rgb >> 0) & 0xFF) / 255.0 self.init(red: r, green: g, blue: b) } } extension Color { static let hex5E3D25 = Color(hex: "5E3D25") static let hex886D5A = Color(hex: "886D5A") static let hexD8CDC3 = Color(hex: "D8CDC3") static let hexFFDCAB = Color(hex: "FFDCAB") static let hexEFEFEF = Color(hex: "EFEFEF") static let hex677775 = Color(hex: "677775") static let hexBDCFCD = Color(hex: "BDCFCD") }
(CODE) SwiftUI 컬러 익스텐션 만들기 - 헥스코드활용
목차 Color Extension 에 대해 알아보도록 합시다. 컬러 익스텐션 SwiftUI를 통해 개발을 할 때 자주 쓰일 컬러를 만들어 보도록 하겠습니다. 먼저 SwiftUI View템플릿으로 ColorExtentsion.swift파일을 하나 만
seons-dev.tistory.com
색은 여기 블로그 참고해서 원하는 색을 설정해 줌
사용하는 색이 어플마다 한정적이어서 이렇게 설정하면 좋은 듯?
private func loadDiaryData() { let fetchRequest: NSFetchRequest<DiaryDate> = DiaryDate.fetchRequest() fetchRequest.predicate = NSPredicate(format: "dateString == %@", dateFormat) fetchRequest.sortDescriptors = [] // 정렬 기준이 필요하면 여기에 추가 do { diary = try viewContext.fetch(fetchRequest) } catch { print("Error fetching memos: \(error.localizedDescription)") diary = [] } } private func loadMoneyData() { let fetchRequest: NSFetchRequest<Money> = Money.fetchRequest() fetchRequest.predicate = NSPredicate(format: "dateString == %@", dateFormat) fetchRequest.sortDescriptors = [] // 정렬 기준이 필요하면 여기에 추가 do { money = try viewContext.fetch(fetchRequest) } catch { print("Error fetching memos: \(error.localizedDescription)") money = [] } } private func loadFeelsData() { let fetchRequest: NSFetchRequest<Emotions> = Emotions.fetchRequest() fetchRequest.predicate = NSPredicate(format: "dateString == %@", dateFormat) fetchRequest.sortDescriptors = [] // 정렬 기준이 필요하면 여기에 추가 do { feels = try viewContext.fetch(fetchRequest) } catch { print("Error fetching memos: \(error.localizedDescription)") feels = [] } }
돌아보기 화면에서는 요런 함수를 만들어서 호출을 시켰는데
이것만 있으면 화면 전환할 때마다 바뀔 줄 알았는데 이것만 있으면 안 된다는...!
이게 참 수정하고 나면 바로 데이터가 반영이 안 되고 완료 버튼을 눌러야지 그제야 반영이 되는 문제가 있었다
완료 버튼을 누를 때는 뷰가 다시 그려지기 때문에 다른 것도 다 바뀌어져서 그런 거라고 피드백을 받아서 이해하고
@FetchRequest(entity: DiaryDate.entity(), sortDescriptors: []) var imageMemo: FetchedResults<DiaryDate>
이런 형식의 코드를 사용하면 계속 실시간으로 바뀐다고 하는데
아직은 잘 이해가 안돼서..! 그리고 이미 짜놓은 코드들이 있어서 바꾸기가 좀 어려웠다는......
그래서 다른 방법을 찾아서..!
ScrollView{ VStack{ // 생략 } } .onAppear { loadDiaryData() loadMoneyData() loadFeelsData() self.diaryMemo = (diary.first?.memo)! self.happy = Int(feels.first!.happy) self.sad = Int(feels.first!.sad) self.angry = Int(feels.first!.angry) self.panic = Int(feels.first!.panic) self.anxiety = Int(feels.first!.anxiety) }
그래서 찾은 방법은 .onAppear을 이용해서 바로 반영해 주기!
load 한 다음에 그 데이터를 바로 원하는 변수에 반영해 주면 화면 바뀔 때(수정 화면에서 수정하고 Dismiss 할 때 안돼서 골치였다는..!) 바로 반영이 된다!
이 정도 해주고.. 다른 거는 색 입히고 레이아웃 다시 설정하고 좀 이쁘게 꾸미냐고 조금 시간이 걸린 듯..!
추가로 CoreData 사용하는 파일에서는 저번 블로그에서 Relationships를 다 연결시켜서 했는데 잘 안돼서
각각 엔티티에 필터 기준이 되는 dateString 속성을 하나씩 넣어두었음
통계 내는 것도 이제 할 거라서 MoneyTotal도 만들었는데..
음 사실 Money에서 해결하고 싶었는데 잘 안 그려져서 엔티티 하나 더 만들기로.. ㅎ
'Swift > 다이어리' 카테고리의 다른 글
내가 필요한 다이어리4 (1) 2024.04.16 내가 필요한 다이어리3 (1) 2024.04.15 내가 필요한 다이어리2 (0) 2024.04.14 내가 필요한 다이어리1 (0) 2024.04.13