2012-04-19 9 views
11

Mam podklasę kontrolera widoku, SignInViewController, używaną do logowania, które może być potrzebne w dowolnym momencie. Zamiast tego, aby każdy kontroler widoku w mojej aplikacji nasłuchiwał powiadomienia, które jest wymagane, wolałbym, aby delegat aplikacji zrobił to.Obecny kontroler widoku storyboard z delegata aplikacji?

Ale jak wyzwolić to z mojego uczestnika aplikacji?

Czy umieściłem SignInViewController w moim głównym scenariuszu? Jeśli tak, w jaki sposób mogę uzyskać dostęp do mojego scenariusza z mojego uczestnika aplikacji? A może jakieś inne podejście jest lepsze?

Odpowiedz

24

Możesz zawsze odwoływać się do delegata aplikacji poprzez singleton UIApplication. Stamtąd zawsze możesz uzyskać kontroler widoku głównego. Za pomocą kontrolera widoku głównego można uzyskać odniesienie do scenorysu.

Gdy już masz swoją planszę, wszystko co robisz, to utworzenie instancji kontrolera widoku, który chcesz. Przedstaw to.

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

Może istnieć bardziej bezpośredni sposób uzyskania odniesienia do scenorysu, ale prawie zawsze będzie to dla Ciebie.

+0

Co to jest "currentVC"? – Andreas

+0

To oznacza odwołanie do kontrolera widoku, nad którym aktualnie pracujesz, wykonane za pomocą słowa kluczowego "self" zamiast "currentVC". –

+5

, ale zapytał o prezentację z appDelegate "przed" byciem w jakimkolwiek kontrolerze podglądu – Zerho

0

Aby pokazać kontroler widoku z dowolnego miejsca (w tym z delegata aplikacji), użyłem tego kodu z powodzeniem w iOS 8+ (nie jestem pewien co do wcześniejszej zgodności). Pojawi się z widoku modalnego, jeśli taki istnieje.

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]; 
    }); 
} 

Zazwyczaj owijam to w wygodną metodę i przekazuję w moim instancji kontrolera widoku. Do OP - tworzysz SignInViewController w storybooku, przypisujesz mu unikalny identyfikator storyboard, a następnie zastępujesz ten ID w powyższym kodzie.

Powiązane problemy