ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 내가 필요한 다이어리5
    Swift/다이어리 2024. 4. 18. 09:08

    후.. 다이어리 4탄은 거의 버리면 되는 수준

    잘못된 코딩을 하고 있었다랄까? 부분 부분?

     

    일단 여태 한 거 작성해 봅니당

    자~ 이런 식으로 만들었는데요?

    내 정보 부분만 나중에 만들어 볼 생각입니다^^

     

    좀 알게 된 것(?)은

     

    이전 블로그에서 NavigationLink마다 이렇게

    .environment(\.managedObjectContext, persistenceController.container.viewContext)

    을 작성했는데

    딱 봐도 코드가 길어지고 이상하죠..?

     

    https://medium.com/@Jager-yoo/swiftui-environmentobject-%EC%A3%BC%EC%9E%85%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%82%AC%EC%9A%A9-%EC%8B%9C-%EC%A1%B0%EC%8B%AC%ED%95%A0-%EC%A0%90-0ae7747a5fd3

     

    [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")
    }

     

    https://seons-dev.tistory.com/entry/CODE-SwiftUI-%EC%BB%AC%EB%9F%AC-%EC%9D%B5%EC%8A%A4%ED%85%90%EC%85%98-%EB%A7%8C%EB%93%A4%EA%B8%B0-%ED%97%A5%EC%8A%A4%EC%BD%94%EB%93%9C%ED%99%9C%EC%9A%A9

     

    (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

    댓글

Designed by Tistory.