"Learn how to customize the UIKit state restoration process."
UIKit
상태 복원 과정을 커스터마이징 하는 방법에 대해 알아봅니다.
Figure 1은 앱이 복구되기까지 앱 launch 시점으로부터 발생하는 호출의 연속을 보여줍니다. 복원은 앱의 초기화 중간 시점 동안 발생하며, 상태 복원 아카이브가 사용 가능하고 앱 딜리게이트의 application(_:shouldRestoreApplicationState:)
메소드가 true
를 반환할 때에만 진행됩니다.
Figure 1 The interface restoration sequence
복원 과정의 첫 번째 단계는 인터페이스를 위한 뷰 컨트롤러 객체(명시적이거나 암묵적이거나 상관없이)를 생성하는 것입니다. 두 번째 단계는 이 객체들의 상태를 디코딩하고 복원하는 것입니다. 두 단계 모두 뷰 컨트롤러 계층구조 재생성에 있어 필요합니다.예를 들어 네비게이션 컨트롤러와 네비게이션 컨트롤러의 자식 뷰 컨트롤러 생성 이후 해당 객체들 사이의 즉각적인 연결은 없습니다. 실제로는 네비게이션 컨트롤러 및 네비게이션 컨트롤러의 자식 뷰 컨트롤러 사이의 관계를 재구성해주는 네비게이션 컨트롤러의 decodeRestorableState(with:)
메소드입니다.
상태 복원이 마무리된 후 UIKit
은 앱 딜리게이트의 application(_:didFinishLaunchingWithOptions:)
메소드를 호출합니다. 최근 변경사항 혹은 인터페이스에 추가된 부분을 만들기 위해 이 메소드를 사용하시기 바랍니다. 예를 들어 뷰 컨트롤러 계층구조에 로그인 스크린을 추가할 것입니다.
복원이 진행되는 동안 UIKit
은 보존된 인터페이스로부터 뷰 컨트롤러의 생성 혹은 위치시키는 것을 시도합니다. UIKit
은 우선 뷰 컨트롤러 객체 제공을 요청합니다. 뷰 컨트롤러를 제공하지 않은 경우 UIKit
은 이를 암묵적으로 찾습니다. 아래는 UIKit
이 뷰 컨트롤러를 재생성하기 위해 따라가는 단계의 연속을 보여줍니다.
restorationClass
속성에 할당하는 것을 통해 복원 클래스를 선언할 수 있습니다. 복원 과정이 진행되는 동안 UIKit
은 뷰 컨트롤러의 새 인스턴스 요청을 위해 복원 클래스의 viewController(withRestorationIdentifierPath:coder:)
메소드를 호출하며, 이 메소드는 요청한 새 인스턴스를 번환합니다. 만약 nil
을 반환하도록 하면, UIKit
은 뷰 컨트롤러 생성 시도를 멈추고 복원 과정에서 빠져나옵니다.UIKit
은 앱 딜리게이트의 application(_:viewControllerWithRestorationIdentifierPath:coder:)
메소드를 호출합니다. 해당 메소드에서 nil
을 반환하도록 하면, UIKit
은 탐색을 계속합니다.UIKit
은 정확히 같은 복원 경로를 갖는 이미 생성된 뷰 컨트롤러를 찾습니다.UIKit
은 앱의 스토리보드로부터 자동으로 뷰 컨트롤러를 인스턴스화합니다.상태 복원 시작 전에도 UIKit
은 앱의 기본값 뷰 컨트롤러를 스토리보드로부터 로드합니다. UIKit
은 이러한 뷰 컨트롤러를 자유롭게 로드할 수 있기 때문에 복원 클래스 혹은 앱 딜리게이트를 사용해서 뷰 컨트롤러를 생성하지 않는 것이 더 낫습니다. 다른 뷰 컨트롤러의 경우 뷰 컨트롤러가 스토리보드에서 정의되지 않은 경우에만 복원 클래스를 할당하시기 바랍니다. 특정 상황에서 뷰 컨트롤러의 생성을 막기 위해 복원 클래스를 할당할 수도 있습니다. 예를 들어 관련 복원 아카이브가 오래된 데이터 혹은 누락된 데이터를 참조하고 있는 경우 뷰 컨트롤러를 표시하는 것을 피하길 원할 것입니다.
코드에서 뷰 컨트롤러를 재생성하는 경우 다른 모든 초기화와 더불어 항상 뷰 컨트롤러의 restorationIdentifier
속성에 값을 재할당해야 합니다. 이러한 값을 생성 시점에 할당하는 것은 뷰 컨트롤러가 다음 주기 동안 보존될 것을 보장해줍니다.
func viewController(withRestorationIdentifierPath
identifierComponents: [Any],
coder: NSCoder) -> UIViewController? {
let vc = MyViewController()
vc.restorationIdentifier = identifierComponents.last as? String
vc.restorationClass = MyViewController.self
return vc
}
Note
복원 클래스는 항상UIKit
에 의해 예상되는 클래스를 반환해야 합니다. 복원 아카이브는 각각의 보존된 뷰 컨트롤러의 클래스를 포함합니다. 복원 클래스가 다른 클래스의 인스턴스를 반환하는 경우UIKit
은 해당 뷰 컨트롤러의decodeRestorableState(with:)
메소드를 반환하지 않습니다.
UIKit 상태 보존 프로세스를 커스터마이징 하는 방법에 대해 알아봅니다.
https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches/about_the_ui_preservation_process
https://velog.io/@panther222128/About-the-UI-Preservation-Process