2012-04-19 2 views
11

나는보기 컨트롤러 서브 클래스 인 SignInViewController을 필요로 할 수있는 로그인에 사용합니다. 내 앱의 모든보기 컨트롤러가 로그인이 필요한 알림을 수신하는 대신 앱 위임을해야합니다.응용 프로그램 대리인의 스토리 보드보기 컨트롤러가 있습니까?

하지만 내 응용 프로그램 대리인에서 어떻게 트리거합니까?

내 스토리 보드에 SignInViewController을 넣습니까? 그렇다면 내 앱 대표자에게 내 스토리 보드에 어떻게 액세스합니까? 아니면 다른 접근법이 더 좋습니까?

답변

24

언제든지 UIApplication 단독 기능을 통해 응용 프로그램 대리인을 참조 할 수 있습니다. 거기에서 항상 루트보기 컨트롤러를 얻을 수 있습니다. 루트보기 컨트롤러를 사용하면 스토리 보드에 대한 참조를 얻을 수 있습니다.

일단 스토리 보드가 있으면 원하는 뷰 컨트롤러의 인스턴스를 인스턴스화하면됩니다. 선물하십시오.

AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
MainViewController *mvc = (MainViewController *)appDelegate.window.rootViewController;  
LoginViewController *lvc = [mvc.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"]; 
[currentVC presentModalViewController:lvc animated:YES]; 

스토리 보드에 대한 참조를 얻는 방법은 더 직접적 일 수 있지만 거의 항상 도움이됩니다.

+0

'currentVC'란 무엇입니까? – Andreas

+0

"currentVC"대신 "self"키워드를 사용하여 현재 수행중인 뷰 컨트롤러를 참조하십시오. –

+5

하지만 그는 appconteate에서 "이전에"어떤 viewcontroller에 있을지에 대해 물었다. – Zerho

0

어디서든 (앱 대리인을 포함하여)보기 컨트롤러를 표시하기 위해 iOS 8 이상에서이 코드를 사용했습니다. 이전 호환성에 대해서는 잘 모르겠습니다. 모달보기에서 표시됩니다.

YOURAppDelegate *appDelegate = (YOURAppDelegate *)[[UIApplication sharedApplication] delegate]; 
UINavigationController *rootNavC = (UINavigationController *)appDelegate.window.rootViewController; 
UIViewController *topVC = rootNavC.topViewController; 

UIViewController *myNewVC = [rootNavC.storyboard instantiateViewControllerWithIdentifier:<YOUR STORYBOARD ID>]; 

if (topVC.presentedViewController) 
{ 
    if ([topVC.presentedViewController class] == [UINavigationController class]) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [((UINavigationController*)topVC.presentedViewController) pushViewController:myNewVC 
                       animated:YES]; 
     }); 
    } 
    else 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [topVC.presentedViewController.navigationController pushViewController:myNewVC 
                      animated:animated]; 
     }); 
    } 
} 
else 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [rootNavC pushViewController:myNewVC 
          animated:animated]; 
    }); 
} 

일반적으로 이것을 편리한 방법으로 포장하고 인스턴스화 된보기 컨트롤러를 전달합니다. OP로 - 스토리 보드에 SignInViewController를 만들고, 고유 한 스토리 보드 ID를 할당 한 다음 위 코드에서 해당 ID로 대체하십시오.

관련 문제