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

Похоже, что все должно быть просто, но в нем много сложных нюансов, и я не нашел ответа где-либо еще о переполнении стека, который бы отвечал на этот вопрос полностью, четко и просто.

В двух словах - у меня есть приложение для iPad, которое использует раскадровки для компоновки потока приложения, и контроллер с разделенным представлением в качестве основного контроллера корневого представления.

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

Проблема, однако, - где должна быть сделана эта условная проверка и как должен быть создан экран входа в систему?

Я перепробовал каждую перестановку, которую только мог придумать.

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

В методах запуска для детального контроллера разделенного представления кажется следующее очевидное место.

Ближайшее к рабочему решению, которое я могу найти, описано здесь:https: //stackoverflow.com/a/8224389/52977

<code>- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Login"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];

    [self presentModalViewController:vc animated:NO];
}
</code>

Но с этой реализацией, вызываемой контроллером детального вида разделенного вида, базовый разделенный вид кратковременно мигает на экране.

Если я переключаюсь с viewDidAppear на viewWillAppear, вспышки нет, но при входе в систему изображение отображается в портретной ориентации, даже если экран повернут в горизонтальную плоскость.

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

Какие-нибудь советы? Указатели на хорошие рабочие примеры?

Ответы на вопрос(4)

представив пользователю первый контроллер представления в качестве экрана входа в систему. Тогда есть переход, связанный со следующим экраном с представлением табуляции или разделенным видом или чем угодно.

Этот первый контроллер обрабатывает значения по умолчанию и учетные данные для входа в систему, а после того, как все это проверено и проверено, следует за процессом ... в противном случае он показывает пользователю логин и / или ошибку и сидит там.

 Fattie30 мар. 2014 г., 11:56
Правильно, вы классно (и досадно!) Не можете сменить контроллер на разделенное представление, они должны быть «целым приложением». (Довольно глупо, правда, Apple.)
 radven22 мая 2012 г., 23:56
Насколько я могу судить, ваша техника не работает с контроллером разделенного представления - UISplitViewController хочет быть корнем, а его установка вызывает серьезные проблемы с поворотом экрана. Если у вас есть хороший рабочий пример, я хотел бы увидеть его.

прежде чем добавлять подпредставления:

UITabBarController* tc = (UITabBarController*) self.window.rootViewController;

// Present the log in view controller
self.window.hidden = NO; // the window is initially hidden
[tc presentViewController:logInViewController animated:NO completion:NULL];

но после долгих поисков ответ Дуэйна дал мне некоторое понимание. Его ответ все еще мигает в предыдущем представлении, но я решил проблему с помощью:

-(void)viewWillAppear:(BOOL)animated {

    // Check if user is already logged in
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if ([[prefs objectForKey:@"log"] intValue] == 1) {
        self.view.hidden = YES;
    }
}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    // Check if user is already logged in
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    if ([[prefs objectForKey:@"log"] intValue] == 1) {
        [self performSegueWithIdentifier:@"homeSeg3" sender:self];
    }
}

-(void)viewDidUnload {
    self.view.hidden = NO;
}

Вот как я решил это в SWIFT

override func viewWillAppear(animated: Bool) {
    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
    if (isloggedIn != false) {
        self.view.hidden = true
    } else {
        self.view.hidden = false
    }
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)

    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
    if (isloggedIn != false) {
        println("this should work")
        self.performSegueWithIdentifier("Login", sender: self)
    }
}

Ваш ответ на вопрос