2017-02-02 4 views
0

Мое приложение было создано с моим экраном входа в качестве начального VC. Когда пользователь успешно регистрируется, я создаю контроллер навигации и устанавливаю homeVC в качестве контроллера корневого представления. На любой странице приложения после входа в систему пользователь может получить доступ к своей информации о моем профиле, а также выйти из системы.Как я должен сбросить свой контроллер корневого представления для выхода из системы

Каков наилучший способ перехода «назад» к контроллеру входа в систему? Я хочу, чтобы все VC были удалены из памяти, но поскольку VC для входа существует вне контроллера навигации, я не могу просто вернуться к контроллеру корневого представления.

Любые рекомендации приветствуются.

ответ

3

Короткий ответ, если вы получите от пользовательского интерфейса входа в основной интерфейс приложения, установив корень окна, тогда это хороший способ вернуться.

// in some view controller in your app when you need to change to the login UI 
UIStoryboard *storyboard = [self storyboard]; 
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyLoginVCIdentifier"]; 
UIWindow *window = [UIApplication sharedApplication].delegate.window; 
window.rootViewController = vc; 

Longer Ответ, я иногда использую контроллер представления, чья единственная работа заключается в управлении этим, назвав его LaunchViewController.

В моей main.storyboard я создаю экземпляр LaunchViewController и устанавливаю «Исходный контроллер просмотра» в true.

Этот VC не нуждается в пользовательском интерфейсе, так как это только работа, чтобы заменить себя, как только он появится. Однако, так как я не хочу даже доли секунды после вспышки моей LaunchScreen.storyboard, я иногда делаю это для наложения вида этого Vc с точкой зрения запуска раскадровки, но эта часть не является обязательной ....

// LaunchViewController.m 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIStoryboard *storyboard = [self.class storyboardWithKey:@"UILaunchStoryboardName"]; 
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LaunchVC"]; 
    [self.view addSubview:vc.view]; 
} 

// a convenience method to get a storyboard from the bundle by key 
+ (UIStoryboard *)storyboardWithKey:(NSString *)key { 
    NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *storyboardName = [bundle objectForInfoDictionaryKey:key]; 
    return [UIStoryboard storyboardWithName:storyboardName bundle:bundle]; 
} 

Возвращаясь к вашему вопросу, мой LaunchViewController обеспечивает, что представляет метод (с анимацией по вашему выбору) главный контроллер представления раскадровки данного это раскадровка идентификатор ...

// LaunchViewController.m 
+ (void)presentUI:(NSString *)identifier { 
    UIStoryboard *storyboard = [self storyboardWithKey:@"UIMainStoryboardFile"]; 
    UINavigationController *vc = [storyboard instantiateViewControllerWithIdentifier:identifier]; 

    UIWindow *window = [UIApplication sharedApplication].delegate.window; 
    window.rootViewController = vc; 

    [UIView transitionWithView:window 
         duration:0.3 
         options:UIViewAnimationOptionTransitionCrossDissolve 
        animations:nil 
        completion:nil]; 
} 

при том, что мы можем дать LaunchViewController любое число общественных методов, таких как ...

+ (void)presentLoginUI { 
    [self presentUI:@"IdentifierOfMyLoginViewController"]; 
} 

+ (void)presentMainAppUI { 
    [self presentUI:@"IdentifierOfMyMainAppViewController"]; 
} 

Поскольку системное окно имеет единственный указатель на контроллер корневого представления, и вы заменяете этот указатель на presentUI:, ARC очистит весь отброшенный пользовательский интерфейс для вас.

+0

Это действительно отличный ответ. – SAHM