Как загрузить нужный viewController в iOS?

При загрузке, мне надо что бы приложение проверило какого значение сейчас в UserDefaults в одном ключе, и в зависимости от значения, открыло разные viewController'ы. Проще говоря, если юзер уже залогинен - открывает главный экран, если нет - то экран авторизации. Где и как это реализовать?
  • Вопрос задан
  • 3920 просмотров
Решения вопроса 1
firmach
@firmach
В случае со storyboard я делаю следующим образом:
- в Deployment Info нужного таргета убираю Main Interface;
- добавляю в метод application:didFinishLaunchingWithOptions: AppDelegate следующий код
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"YourStoryboardName" bundle:nil];
   
    UIViewController *firstViewControllerToShow = nil;
    
    if (yourCondition) {
        firstViewControllerToShow =
            [storyboard instantiateInitialViewController];
    } else {
        firstViewControllerToShow =
            [storyboard instantiateViewControllerWithIdentifier:@"YourAlternativeSceneStoryboardID"];
    }
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = firstViewControllerToShow;
    [self.window makeKeyAndVisible];
    
    return YES;
}


где yourCondition - условие в зависимости от которого надо показать тот или иной ViewController, например - зарегистрирован пользователь или нет. Если зарегистрирован, то будет показан ViewController, который указан как Initial в storyboard. Если нет - ViewController с идентификатором YourAlternativeSceneStoryboardID.

Собственно, без storyboard все тоже самое, но без storyboard. :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
leoru
@leoru
Software Engineer для мобильных платформ
Если сториборду, то моя тактика обычно такая:
1. Создаю InitialController, назначаю его initial в сториборде.
2. В нем в viewDidLoad проверяю, есть ли пользователь, авторизован ли и отображают тот контроллер, который мне нужен:
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self checkAuth];
}

- (void)checkAuth
{
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *navController;
	if (![AUUser currentUser]) {
        navController = [storyboard instantiateViewControllerWithIdentifier:@"authContainer"];
    } else {
        navController = [storyboard instantiateViewControllerWithIdentifier:@"mainViewContainer"];
    }
    
    navController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    navController.view.frame = self.view.bounds;
   
    [self addChildViewController:navController];
    [self.view addSubview:navController.view];
    self.currentController = navController;
}
Ответ написан
leoru
@leoru
Software Engineer для мобильных платформ
Используете сториборду или нет?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
AdCombo Санкт-Петербург
от 120 000 до 200 000 ₽
Азбука Вкуса Самара
от 80 000 до 110 000 ₽
FunCorp Москва
от 200 000 ₽