2015-12-12 3 views
0

Я разделил свой проект на две раскадровку:IOS - Переход между различной раскадровкой контроллерами отображения

  • Main.storyboard - Для аутентификации пользователя. Также это раскадровка по умолчанию.

  • Login.storyboard - Для не прошедшего проверку подлинности пользователя.

App Делегат файл:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    if(user is authenticated) 
    { 
     [self presentLoginScreen:YES]; 
     return YES; 
    } 

Войти экран в приложении файл делегат:

-(void)presentLoginScreen:(BOOL)animated{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:[NSBundle mainBundle]]; 
    UIViewController *vc =[storyboard instantiateInitialViewController]; 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.rootViewController = vc; 
} 

На выходе из системы, Логин экран представлен. Я определил это в приложение делегата файла:

-(void)logOut{ 
    //clear data 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:[NSBundle mainBundle]]; 
    UIViewController *vc =[storyboard instantiateInitialViewController]; 
    self.window.rootViewController = vc; 
    //Show login Screen 
    [self presentLoginScreen:NO]; 
} 

От ViewController из MainStoryBoard (letsay mainstoryboardVc.m), выход называется как:

-(void)didTouchLogOut{ 
    NSLog(@"GoodBye"); 
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate]; 
    [appDelegateTemp logOut]; 
} 

Это вызывает много вопрос:

  • Во-первых, когда я выхожу из системы и перехожу к экрану входа в систему, я все еще вижу mainstoryboardVc.m в фоновом режиме, который выглядит очень неуклюжим.

  • я выйти, снова войти и снова пытается выйти, я вижу следующее сообщение:

Представление контроллеров отображения на отдельных контроллерах зрения не приветствуется

и экран входа в систему не представлен.

Я попробовал много ответов в Интернете на просмотр контроллера презентаций между двумя раскадровки без сохранения истории, ничего не кажется, работает ...

+2

Так ты сделал вещи гораздо более сложным без усиления? * Почему вы используете две разные раскадровки? – luk2302

+0

Какой смысл использовать 2 раскадровки? –

+0

Coz количество сцен было велико, два компонента довольно независимы, и каждый раскадровка была разработана различными разработчиками. Слияние двух будет последним вариантом, но было бы здорово, если бы мне не пришлось использовать этот последний вариант. –

ответ

0

Чтобы поменять UIViewControllers есть несколько других методов, которые должны вызываться при переходе контроллер вид корня:

Objective-C:

- (void)setRootViewController:(UIViewController *) newRootViewController { 

    UIViewController* currentViewController = self.window.rootViewController; 
    if (newRootViewController != currentViewController) { 
     [currentViewController willMoveToParentViewController:nil]; 
     [currentViewController.view removeFromSuperview]; 
     [currentViewController removeFromParentViewController]; 
     self.window.rootViewController = newRootViewController; 
    } 
} 

Свифта:

func setRootViewController(newRootViewController: UIViewController) { 
    if let currentViewController = self.window?.rootViewController { 
     if currentViewController != newRootViewController { 
      currentViewController.willMoveToParentViewController(nil) 
      currentViewController.view.removeFromSuperview() 
      currentViewController.removeFromParentViewController() 
      self.window?.rootViewController = currentViewController 
     } 
    } 
} 
0

Два объекта UIViewController дублируются, потому что вы установили self.window.rootViewController для них обоих.Попробуй это;

Вход

-(void)presentLoginScreen:(BOOL)animated{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:[NSBundle mainBundle]]; 
    UIViewController *vc =[storyboard instantiateInitialViewController]; 
    self.window.rootViewController = vc; 
    [self.window makeKeyAndVisible]; 
} 

Выйти

-(void)logOut{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:[NSBundle mainBundle]]; 
    UIViewController *vc =[storyboard instantiateInitialViewController]; 
    [self presentViewController:vc animated:YES completion:nil]; 
}