IOS8 Delegate: AnyObject Delegate를 사용해서 ViewController 간의 데이터를 전달하는 것을 연습했다. 강의에서 Delegate를 AnyObject를 상속받아서 클래스화 시켰는데 이유를 모르겠어서 찾아봤다. SettingViewController는 SettingDelegate를 채택하는 무언가가 필요하다. 이 앱에서는 MainViewController가 SettingDelegate를 채택하고 있다. 따라서 MainViewController는 SettingViewController를 참조하고 SettingViewController는 MainViewController를 참조하게 된다. 위와 같이 서로를 참조하게 되는 경우 순환참조가 발생할 수 있으니 이를 방지하기 위해 delegate를 weak로 선언해주고 싶다. .. 2023. 12. 23. Timer DatePicker로 시간을 설정하는 카운트 다운 타이머 앱. 보는 강의가 UIKit으로 구현하여 SwiftUI로 바꿔보려고 했는데 SwiftUI에서는 카운트 다운 모드가 없었다. 이참에 SwiftUI에서 UIKit 사용하는 방법도 공부해야지 룰루~ Count Down Timer 모드로 설정하고 시간 간격은 1분으로 설정했다. Storyboard에서 알아야 할 것은 이 정도. 타이머를 동작시키기 위해서 DispatchSourceTimer를 사용하였다. var timer: DispatchSourceTimer? var duration = 60 // DatePicker에서 설정한 시간 var currentSeconds = 0 // 카운트 다운 될 시간 func startTimer() { current = du.. 2023. 12. 21. NavigationStack struct NavigationStackContentView: View { var body: some View { NavigationStack { NavigationLink { DestinationView() } label: { Label("Navigation", systemImage: "safari") } .navigationTitle("NavigationStack") // .navigationBarTitleDisplayMode(.inline) } } } struct DestinationView: View { var body: some View { Text("Destination") } } NavigationStack은 root view를 가지고 있는 스택으로 스택의 가장 최상위에 있는 뷰가 보여지도록.. 2023. 11. 21. ProgressView struct ProgressContentView: View { var body: some View { VStack(spacing: 30) { ProgressView(value: 37, total: 100) .progressViewStyle(.linear) .padding() ProgressView(value: 28, total: 100) .progressViewStyle(.circular) .padding() } } } Timer를 이용해서 ProgressView 상태를 1초마다 10씩 증가해보았다. 시작, 일시정지, 중지 버튼에 따라 타이머가 동작하도록 하였고 타이머 상태에 따라 버튼의 활성 상태를 변경하였다. struct ProgressContentView: View { private let PROG.. 2023. 11. 21. 이전 1 2 다음