직접 만든 이 앱의 전체적인 흐름을 스스로 설명할 수 있게 된다면, 더 큰 도움이 될 것이라 생각한다.
앱 시작점과 전체 흐름
- 앱 진입점: studygoApp.swift
@main struct studyGoApp: App { var body: some Scene { MenubarExtra { StudyMenuView() // 팝오버 메뉴 내용 } label: { MenuBarTimerView() // 메뉴바에 표시될 아이템 } .menuBarExtraStyle(.window) } } - @main으로 앱의 시작점을 정의
- MenubarExtra 를 사용해 메뉴바 앱으로 만든다.
- label에는 MenuBarTimerView가 들어가서 메뉴바에 표시
- MenuBarExtra를 클릭하면 StudyMenuView가 팝오버로 나타남
- 메뉴바 표시: MenuBarTimerView.swift
struct MenuBarTimerView: View { @StateObject private var studySession = StudySession.shared // 싱글톤 인스턴스 @State private var currentTime = Date() // 지금 시간 let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() // 오 이거 완전 생소한데? var body: some View { HStack(spacing: 6) { // 1. 아이콘 표시(설정에 따라 숨길 수 있게) if !studySession.hideIcon { // hideIcon이 아니면 Image(systemName: "book.fill") .foregroundColor(.blue) .font(.caption) } // 2. 커스텀 텍스트 + 시간 표시 if !studySession.customText.isEmpty { // 내용 有 if let currentSubject = studySession.currentSubject { Text("\(studySession.customText) \(studySession.currentSessionTime)") } else { Text("\(studySession.customText) 0m") } } else { // 커스텀 텍스트가 없으면: 시간만 표시 if let currentSubject = studySession.currentSubject } } } } [[싱글톤 인스턴스 패턴]]