iOS 6에서 Apple은 상태 복원을 UIViewController
및 관련 클래스에 추가했습니다. 이렇게하면 응용 프로그램이 종료 될 때 상태를 저장하고 사용자가 응용 프로그램을 다시 시작할 때 상태를 복원 할 수 있습니다.UIViewController 상태 복원 - 약한 관계
모든 것이 잘 작동하는 것처럼 보이지만 패턴에 맞지 않는 이상한 시나리오에 도달했습니다.
두 개의보기 컨트롤러, ViewControllerOne
및 ViewControllerTwo
이 있다고 가정하면 둘 다 성공적으로 복원 된 임의의 상태가 저장됩니다. 이제 ViewControllerOne
에는 delegate
속성이 있고 ViewControllerTwo
은 해당 대리자 (모달보기 컨트롤러의 공통 패턴)라고 상상해 봅시다. 누가이 관계를 복원 할 책임이 있습니까? 어떻게 저장/복원해야합니까?
특정 경우 스토리 보드가 포함되지 않으며 복원은 코드에서 restorationClass
속성을 통해 발생합니다. 내 첫 번째 본능은 복원 클래스에서 뷰 컨트롤러를 생성하는 동안 관계를 복원하고 복원하는 것이었지만, restorationClass
에는 다른 기존 컨트롤러가 없다는 것을 알았으므로 이러한 관계를 복원 할 수 없었습니다.
또는 delegate
속성을 선언하는보기 컨트롤러 인 경우 관계를 복원해야한다고 가정하면 다른 클래스에서 복원 된 컨트롤러 인스턴스는 어떻게됩니까? 간단히 말해서, 이것은 잘 문서화되지 않은 시나리오처럼 보입니다. 누군가가 그것에 대해 밝힐 수 있기를 바랬습니다.
이것은 분명히 일을하는 그럴듯한 방법이지만, 그것이 가장 우아하지 않다는 것에 동의하지 않습니까? 즉, 첫 번째 제안 된 솔루션이 캡슐화를 약간 깨뜨린 것처럼 느껴집니다 (AppDelegate는 "알 수있는 모든 것"이 아닌 원하는 것)? 두 번째는 좀 더 흥미로운 접근 방식입니다. decodeRestorableStateWithCoder :? –
옵션이 있지만 컨트롤러가 먼저 복원되는 타이밍에 대해 걱정해야합니다. –
@HenriNormak BTW, 첫 번째 방법은 반드시 캡슐화를 중단하지 않습니다. 프로토콜을 구현할 수 있는데,'didFinishRestoration' 메소드가있는'PostRestorationHandler'라고 부르며, 위임 뷰 컨트롤러가 위임을 설정하게하십시오. AppDelegate는 뷰 컨트롤러 (및 애플 리케이션 델리게이트에 관한 것)가 존재하지만, 내부를 만지지는 않는다는 것을 알고 있습니다. –