SwiftUI

SwiftUI | Responding to events

ziziDev 2024. 8. 2. 14:16
반응형

Responding to events

지금까지 배운 SwiftUI 프로퍼티 래퍼를 사용해서 앱의 사용자자 인터페이스에서 상태를 관리하고 사용자 상호작용에 응답할 수 있습니다

하지만 앱 상태의 변화에 따라 어떻게 동작을 수행할 수 있을지 알 수 있을까?

이 문서에는 SwiftUI 장면 아키텍처, 앱 상태, 뷰가 화면에 나타나고 사라지는 등 이벤트에 반응하는 뷰에 대해서 알아보고자 합니다

Scene architecture

앱 상태를 살펴보기 전에 SwiftUI가 장면을 구성하는 방법을 살펴볼 수 있습니다

Scene은 시스템이 관리하는 수명 주기가 있는 앱 사용자 인터페이스의 일부라고 할 수 있습니다

 

앱을 만들려면 앱 protocol을 준수하는 구조를 정의하고 정의 앞에 @main 속성을 추가하여 유일한 진입점이라고 시스템에 알려줍니다(C++동일)

데이터를 리스트에 표시하기 예제에서는 Scrumdinger의 루트 뷰를 ScrumView로 설정할 때 앱의 구조를 다루었습니다

 

앱 구조에서 body에서는 Scene protocol을 준수하는 하나 이상의 장면을 넣어야합니다

장면은 앱이 표시하는 뷰 계층 구조의 컨테이너입니다 

예를 들어서 iOS / watchOS에서는 하나의 장면을 표시하고 있지만 macOS / iPadOS에서는 여러개의 장면을 표시하도록 화면 디자인을 할 수 있습니다

SwiftUI는 App구조체에서 사용하는 windowGroup과 같은 구체적인 화면들을 제공하고 있습니다 

이 시스템은 씬 수명주기를 관리하고 있고 플랫폼과 상황에 적합한 상황에 계층 구조를 표시하고 있습니다

iPadOS의 멀티태스킹은 동일한 앱의 여러작은 인스턴스를 동시에(작은 인스턴스 = 장면 / 씬) 표시할 수 있습니다

Scene phases and transitions

active 장면이 표시되고 사용자가 화면에 표시되는 장면과 상호작용할 수 있습니다
inactive 장면이 표시되지만 시스템에서 장면과 상호 작용을 비활성화했습니다
예를 들어 멀티태스킹 모드에서는 앱의 패널이 다른 패널과 함께 표시되지만 활성 패널이 아닙니다
background 앱이 실행 중이지만 사용자 인터페이스에 표시되지 않는 상황
앱이 종료되기 전에 이 단계에 들어갑니다

 

ScenePhase 환경 값을 사용해서 씬의 현재 상태를 읽을 수 있습니다

때로는 장면이 다른 단계로 전환될 때 앱이 일련의 작업을 수행하기를 원할 수 있습니다 

 

지속성과 동시성챕터에서는 onChange(of:perform:) 수정자를 사용해서 여러 실행에 걸쳐 앱 상태를 저장하게됩니다

이 수정자를 사용하여 장면 단계가 비활성화 될 때 앱 데이터를 저장하는 작업을 트리거할 수 있습니다 

 

Events and state

명령형 패턴에서는 프로그램 상태에 따라 뷰를 변형해야합니다

SwiftUI는 선언형 프로그래밍 패턴을 따르는데 SwiftUI 뷰의 본문에서는 모든 상태에 대해 사용자 인터페이스가 어떻게 나타나야 하는지 설명해야합니다

실행중에 시스템은 상태가 변경될 때마다 관련된 사용자 인터페이스 부분을 업데이트하여 상태와 사용자 인터페이스를 동기화합니다


다음 다이어그램은 SwiftUI가 사용자-유발 이벤트나 앱 상태에 어떻게 반응하는지를 나타냅니다

 

 

다음 다이어그램은 SwiftUI가 사용자-유발 이벤트나 앱 상태에 어떻게 반응하는지를 나타냅니다

사용자 상호작용이나 알림과 같은 이벤트 앱의 반응을 유발하고 이벤트에 응답하여 클로저가 실행되고 이는 source of truth의 변화를 초래할 수 있습니다

변화를 관할한 후 SwiftUI는 뷰를 업데이트하고 사용자 인터페이스를 랜더링합니다

View life cycle events

SwiftUI에서는 뷰가 화면에 나타나거나 사라질 때 상태를 변경하고 싶을 떄 사용할 수 있는 세가지 수명 주기 이벤트 수정자가 있습니다

예를 들어 뷰의 컨트롤을 리셋하거나 네트워크 버서에서 최신 정보를 가져오는 작업을 할 수 있습니다

 

onAppear(perform:) 뷰가 화면에 나타날 때마다, 첫 번째가 아니어도 실행되는 동작
onDisappear(perform:) 뷰가 화면에서 사라질 때 동작을 트리거
task(priority:_:) 뷰가 화면에 나타나기 전에 비동기적으로 실행되는 동작을 트리거

 

이러한 수정자를 사용하면 뷰가 나타나거나 사라질 때 앱의 상태를 변경하는 동작을 수행할 수 있고 사용자에 의해 시작된 이벤트 처럼 

SwiftUI는 뷰 계층 구조를 관리하고 상태 변경에 반응하여 사용자 인터페이스를 업데이트 합니다

 

다음 튜토리얼에서는 다음과 같은 메서드를 구현할 수 있습니다

-스크럼 타이머 시작 및 중지

-발표자의 시간이 끝날 때 알리는 오디오비주얼 플레이어 관리

-음성 인식기 제어

-스크럼의 기록 추가

 

이를 통해서 SwiftUI 수명 주기 이벤트를 효율적으로 활용할 수 있습니다

 

반응형