2013-12-18 6 views
6

iOS 6에서 Apple은 상태 복원을 UIViewController 및 관련 클래스에 추가했습니다. 이렇게하면 응용 프로그램이 종료 될 때 상태를 저장하고 사용자가 응용 프로그램을 다시 시작할 때 상태를 복원 할 수 있습니다.UIViewController 상태 복원 - 약한 관계

모든 것이 잘 작동하는 것처럼 보이지만 패턴에 맞지 않는 이상한 시나리오에 도달했습니다.

두 개의보기 컨트롤러, ViewControllerOneViewControllerTwo이 있다고 가정하면 둘 다 성공적으로 복원 된 임의의 상태가 저장됩니다. 이제 ViewControllerOne에는 delegate 속성이 있고 ViewControllerTwo은 해당 대리자 (모달보기 컨트롤러의 공통 패턴)라고 상상해 봅시다. 누가이 관계를 복원 할 책임이 있습니까? 어떻게 저장/복원해야합니까?

특정 경우 스토리 보드가 포함되지 않으며 복원은 코드에서 restorationClass 속성을 통해 발생합니다. 내 첫 번째 본능은 복원 클래스에서 뷰 컨트롤러를 생성하는 동안 관계를 복원하고 복원하는 것이었지만, restorationClass에는 다른 기존 컨트롤러가 없다는 것을 알았으므로 이러한 관계를 복원 할 수 없었습니다.

또는 delegate 속성을 선언하는보기 컨트롤러 인 경우 관계를 복원해야한다고 가정하면 다른 클래스에서 복원 된 컨트롤러 인스턴스는 어떻게됩니까? 간단히 말해서, 이것은 잘 문서화되지 않은 시나리오처럼 보입니다. 누군가가 그것에 대해 밝힐 수 있기를 바랬습니다.

답변

2

다른보기 컨트롤러를 열기 전에 작업을 수행 할 때와 마찬가지로 위임 뷰 컨트롤러에서 작업을 자체적으로 설정하는 것이 좋습니다.

이 작업을 수행하는 방법에는 몇 가지 옵션이 있습니다.

뷰 컨트롤러의 약한 참조를 전역 액세스 가능한 위치 (예 : 앱 대리자)에 저장하고 application:didDecodeRestorableStateWithCoder:에이 값을 사용하여 위임을 설정할 수 있습니다.이 방법은 API에서이 방법을 사용합니다.

또는 대리자가 수신 대기하고 자신을 위임자로 설정하는 상위보기 컨트롤러에서 "hereIAmThisIsMe"알림 (사용자 정보의 일부인 self)을 게시 할 수 있습니다.

+0

이것은 분명히 일을하는 그럴듯한 방법이지만, 그것이 가장 우아하지 않다는 것에 동의하지 않습니까? 즉, 첫 번째 제안 된 솔루션이 캡슐화를 약간 깨뜨린 것처럼 느껴집니다 (AppDelegate는 "알 수있는 모든 것"이 아닌 원하는 것)? 두 번째는 좀 더 흥미로운 접근 방식입니다. decodeRestorableStateWithCoder :? –

+0

옵션이 있지만 컨트롤러가 먼저 복원되는 타이밍에 대해 걱정해야합니다. –

+1

@HenriNormak BTW, 첫 번째 방법은 반드시 캡슐화를 중단하지 않습니다. 프로토콜을 구현할 수 있는데,'didFinishRestoration' 메소드가있는'PostRestorationHandler'라고 부르며, 위임 뷰 컨트롤러가 위임을 설정하게하십시오. AppDelegate는 뷰 컨트롤러 (및 애플 리케이션 델리게이트에 관한 것)가 존재하지만, 내부를 만지지는 않는다는 것을 알고 있습니다. –