2013-05-02 2 views
9

iOS 응용 프로그램이 로그인 프롬프트와 함께 열립니다. 사용자가 로그인하면 기본보기로 전환됩니다.로그인 성공 후 RootViewController 재 할당

응용 프로그램 : didFinishLaunchingWithOptions에서 RootViewController를 LoginViewController로 설정했습니다. 로그인이 성공

LoginViewController *login = [[LoginViewController alloc] init]; 
[login setDelegate:self]; 
[[self window] setRootViewController:login]; 

경우, LoginViewController은 AppDelegate에의 userDidLogin 메소드를 호출합니다 :

if([[self delegate] respondsToSelector:@selector(userDidLogin)]) { 
    [[self delegate] userDidLogin]; 
} 

userDidLogin 새로운 UINavigationController가를 생성하고 RootViewController로 할당합니다

을 LoginViewController는 위임과 AppDelegate에있다
- (void)userDidLogin 
{ 
    MainRecordViewController *mainRecordViewController = [[MainRecordViewController alloc] init]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:mainRecordViewController]; 
    [[self window] setRootViewController:navController]; 
} 

NSLog를 LoginViewController의 dealloc 메소드에 추가하면 LoginViewControl ler는 그 단계에서 파괴되고 그 실행은 예상대로 계속됩니다.

LoginViewController를 명시 적으로 닫는 데 아무런 작업도하지 않았지만 새로운 RootViewController를 할당하면 이전 버전이 사라지고 ARC가 정리할 수 있다는 가정에 의존합니다.

언제나 그렇다고 신뢰할 수 있습니까? 이것은 합리적인 접근입니까?

미리 감사드립니다.

야고보 rootViewController 재산 상태의

+1

사이드 노트 : ARC가 공개하지 않은 내용과 확실하지 않은 것이 있으면 dealloc 메소드를 구현하고 NSLog (@ "MySuperDuperClass의 인스턴스가 ARC에 의해 할당 해제 됨")와 같이 인쇄 할 수 있습니다. – Groot

+0

고마워요. 이미 해 봤습니다. 그것이 "NSLog를 dealloc 메소드에 추가함으로써 ..."라는 의미입니다. 보기가 제대로 닫힌 것처럼 보입니다. 항상보기가 꺼져있는 것처럼 보입니다. 그러나 저는 항상 그 일에 의지 할 수 있는지 궁금합니다. 나는 그것이 괜찮다고 생각하지만, 잘못 될 수 있다는 가정과 같은 느낌이 들었습니다. ... – James

답변

11

documentation : 윈도우가 기존의 뷰 계층 구조를 가지고

경우, 이전 뷰가 새로 설치하기 전에 제거 있습니다.

따라서 LoginViewController에 대한 참조를 유지하지 않으면 해당 항목이 삭제됩니다.

아마 : RootViewController Switch Transition Animation도 흥미가 있습니다. 루트보기 컨트롤러 을 애니메이션으로 전환하는 방법을 설명합니다.

+1

나는 대답, 미적 세련미를 더했습니다. 매우 감사. – James

관련 문제