"Learn how to customize the UIKit state preservation process."
UIKit
상태 보존 프로세스를 커스터마이징 하는 방법에 대해 알아봅니다.
Figure 1은 인터페이스 보존 과정 동안 발생하는 호출의 연속을 보여주고 있습니다. 앱 딜리게이트에게 앱 상태가 보존되어야 하는지를 물어본 후, UIKit
은 현재 앱의 뷰 컨트롤러 계층구조에 있는 객체를 인코딩합니다. 유효한 restorationIdentifier
를 갖는 뷰 컨트롤러들만 보존됩니다.
보존 과정은 뷰 컨트롤러 계층구조 흐름을 따라 진행되고, 발견하는 객체를 재귀적으로 인코딩합니다. 과정은 앱 윈도우의 루트 뷰 컨트롤러에서 시작하며, 루트 뷰 컨트롤러는 제공된 아카이브에 갖고 있는 데이터를 쓰는 뷰 컨트롤러입니다. 만약 루트 뷰 컨트롤러의 데이터가 다른 뷰 컨트롤러의 레퍼런스를 갖고 있다면, UIKit
은 각각의 새 뷰 컨트롤러가 갖는 데이터를 아카이브에서 분리된 부분으로 인코딩할 것을 각각의 뷰 컨트롤러에게 요청합니다. 이러한 자식 뷰 컨트롤러들은 그들이 갖는 자식들도 인코딩할 것입니다.
UIKit
뷰 컨트롤러는 적합한 때에 자신의 자식 뷰 컨트롤러를 자동으로 인코딩합니다. 커스텀 컨테이너 뷰 컨트롤러를 정의하는 경우 뷰 컨트롤러의 encodeRestorableState(with:)
메소드는 제공된 아카이브에 모든 자식 뷰 컨트롤러를 유사하게 써야(write) 합니다.
뷰 컨트롤러(그리고 이러한 뷰 컨트롤러의 뷰)를 상태 복원 과정으로부터 제외시키는 방법은 두 가지가 있습니다.
restorationIdentifier
속성을 nil
로 설정합니다.viewController(withRestorationIdentifierPath:coder:)
메소드로부터 nil
을 반환합니다.뷰 컨트롤러를 제외시키는 것은 해당 뷰 컨트롤러가 아카이브에 저장되는 것을 방지합니다. 또한, 해당 뷰 컨트롤러의 모든 자식들도 보존되는 것으로부터 제외시킵니다.
상태 복원은 앱의 뷰 및 뷰 컨트롤러에 제한되지 않습니다. UIStateRestoring
프로토콜을 따르는 모든 객체가 복원 아카이브에 포함될 수 있습니다. 예를 들어 앱에 대한 글로벌 설정 데이터를 저장하는 객채에서 이 프로토콜을 채택하는 경우가 있습니다. 이와 같은 방식으로 아카이브에 객체를 추가하려면 아래처럼 수행해야 합니다.
UIApplication
의 registerObject(forStateRestoration:restorationIdentifier:)
메소드 호출을 통해 앱이 실행되는 동안 객체를 등록합니다. 예를 들어 설정 객체의 경우 생성 이후 즉시 등록하게 될 것입니다.encodeRestorableState(with:)
메소드에서 복원 아카이브로 객체를 인코딩합니다. 앱 딜리게이트의 application(_:willEncodeRestorableStateWith:)
에 인코딩할 수도 있습니다.다음 launch 주기 동안 이전 상태로 되돌리기에 충분한 객체라면, 커스텀 객체에 대해 모든 데이터를 인코딩할 수 있습니다. 앱 동작에 중요하지 않은 데이터를 인코딩해야 하고, 다른 방법으로 영구적이어야 하는 데이터를 인코딩하지 않아야 합니다. 예를 들어 앱의 설정 및 launch 주기 사이에서 영구적이어야 하는 사용자 데이터를 인코딩하지 않아야 합니다.
UIKit 상태 복원 과정을 커스터마이징 하는 방법에 대해 알아봅니다.
https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches/about_the_ui_restoration_process
https://velog.io/@panther222128/About-the-UI-Restoration-Process