1

이 문제에 관해 많은 질문을 읽었지만 제대로 작동하지 않는 이유는 알지 못합니다.iOS Objective-C에서 로그인/로그 아웃 후 rootViewController 변경

기본적으로 사용자가 로그인하거나 로그 아웃 한 후 루트 컨트롤러를 변경하려고합니다. 스토리 보드도 사용하고 있습니다. 내 문제는 SILoginViewController dealloc의 함수는 절대로 호출되지 않습니다.이 컨트롤러에서는 Notification을 보내고 관찰자는 제거되지 않으므로 모든 것을 엉망으로 만들고 몇 가지 "로그인/로그 아웃"후에 몇 가지 알림을받습니다.

내 AppDelegate에이 :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [self.window setFrame:[[UIScreen mainScreen] bounds]]; 
    BOOL isLoggedIn = [[SIUser aUser] isLoggedIn]; // from your server response 

    NSString *storyboardId = isLoggedIn ? @"rootViewController" : @"navVcForLogin"; 
    self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:storyboardId]; 


    return YES; 
} 

사용자가 로그인하지 않은 경우 그 성공 신고서 전송하는 프로세스, 여기에 나는 rootViewController 변경하려는 핸들러 :

- (void)loginSuccessHandler:(id)sender 
{ 
     UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; 

     SIRootViewController * vc = [sb instantiateViewControllerWithIdentifier:@"rootViewController"]; 

     [UIApplication sharedApplication].keyWindow.rootViewController = vc; 
} 

은 이것은 로그 아웃과 동일한 프로세스이며 다음은 알림 처리기입니다.

- (void)logoutHandler:(id)sender 
{ 
     UIWindow *myWindow = [(SIAppDelegate *)[[UIApplication sharedApplication] delegate] window]; 

     SILoginViewController * vc = [sb instantiateViewControllerWithIdentifier:@"navVcForLogin"]; 

     [UIApplication sharedApplication].keyWindow.rootViewController = vc; 
} 

가장 쉬운 직접 스토리 보드를 보여하는 것입니다

Storyboard

스토리 보드의 구현은 수 이상한 것 같다하지만 난 자신의 스토리 보드 구현을 다음

https://github.com/romaonthego/RESideMenu을 사용하고 있습니다.

것은 SILoginViewController입니다. dealloc의 메소드는 호출되지 않습니다.

하지만 잘 작동하는 방식으로 보면 응용 프로그램을 실행할 때 동작이 좋지만 나중에는 엉망이 될 것이라고 확신합니다.

UPDATE

는 그리고 나는 그것이 일반적인 행동하지만 루트 뷰 컨트롤러가 변경 될 때 어떤 변화가없는 새로운 컨트롤러가 표시되어 정말 짧은 시간 동안 검은 화면이있는 것 같아요. 내 AppDelegate.m

- (void)changeRootViewController:(UIViewController*)newRootViewController 
{ 
    if (!self.window.rootViewController) { 
     self.window.rootViewController = newRootViewController; 
     return; 
    } 

    UIView *snapShot = [self.window snapshotViewAfterScreenUpdates:YES]; 
    [newRootViewController.view addSubview:snapShot]; 
    self.window.rootViewController = newRootViewController; 
    [UIView animateWithDuration:0.3 animations:^{ 
     snapShot.layer.opacity = 0; 
     snapShot.layer.transform = CATransform3DMakeScale(1.5, 1.5, 1.5); 
    } completion:^(BOOL finished) { 
     [snapShot removeFromSuperview]; 
    }]; 
} 

RootViewController Switch Transition Animation

이 아마 종류의 중복 질문에서 그러나 나는이 문제를 알아 내기 위해 시간을 보냈다 :

검은 색 화면이 사용하여 해결.

+0

Google 시스템에서 transitionViewController를 조회합니다. 그것이 내가 이것을 할 수있는 방법입니다. rootViewController를 새로운 것으로 전환하십시오.다른 몇 가지 호출이 작동하도록하려면 필요한 데 콜이 호출되어야합니다. –

+0

나는이 대답의 해결책을 시도했다. : http://stackoverflow.com/questions/7703806/rootviewcontroller-switch-transition-animation, 나의 전이 문제를 해결 하나,'SILoginViewController' 할당 해제 문제는 해결하지 않는다. – BoilingLime

+0

찾은 해결책이 다른 방법을 구현하지 않는 것 같습니다. 나는 내 컴퓨터에 도착했을 때 다시 게시 할 것이다. –

답변

2
[currentRootViewController willMoveToParentViewController:nil];   // notify the VC of movements 

[self addChildViewController:newRootViewController];  //Add the new VC 

[self transitionFromViewController: currentRootViewController toViewController: newRootViewController 
          duration: 0.15 options:UIViewAnimationOptionCurveEaseInOut 
         animations:^{ 
          newRootViewController.view.frame = currentRootViewController.view.frame; 
         } 
         completion:^(BOOL finished) {  //Cleanup from the move 
          [currentRootViewController removeFromParentViewController]; 
          [newRootViewController didMoveToParentViewController:self]; 
         }]; 

다음 것, willMoveToParentViewControllerdidMoveToParentViewController의 코드가 변경의 ViewController를 통지합니다, 당신은 어딘가에에 대한 포인터를 가지고하지 않는 한의 ViewController 잡고 지금은 아무것도 없기 때문에 당신의 dealloc이 전화를받을한다 코드에 대한 모든 포인터를 무효화해야합니다. 시도한 솔루션은 성공적으로 완료된 전환을 얻는 데 필요한 것의 절반에 지나지 않습니다.

+0

나는 그 코드를 어디에 둘 것인지 모르겠다. 이 순간에 '자기'란 무엇입니까? 변경을 수행하려는 ViewController? – BoilingLime

+0

내 애플 리케이션의 모든 곳에서 rootViewController를 변경하기 위해 정확히'AppDelegate'에 추가 한 것을 보여주기 위해 제 질문을 업데이트했습니다. – BoilingLime

+0

나는 당신이 변경하려고하는 곳에서 정확히 그 코드를 넣을 것이다. 그 시점에서 자아는 아마 appDelegate가 될 것입니다. –