2012-04-19 3 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

Это означает ссылку на какой контроллер просмотра, над которым вы сейчас работаете, сделанный с использованием ключевого слова «self» вместо «currentVC». –

+5

, но он спросил о представлении из appDelegate «до», находясь в любом контроллере просмотра, я ставлю – 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 в раскадровке, назначить ему уникальный идентификатор раскадровки, а затем заменить этот идентификатор в приведенном выше коде.

Смежные вопросы