На мой взгляд, лучшая стратегия для чего-то подобного - это экран входа в систему, который уже представлен на контроллере основного представления при запуске приложения, который удаляется и удаляется после входа пользователя в систему. Я обнаружил, что большинстворанее предложенные решения (а также предложения здесь: Лучшие практики для экрана входа в Storyboard, обработка очистки данных при выходе из системы ) не делают этого элегантно.
После некоторого эксперимента вчера, я думаю,лучший способ сделать это с помощью дочерних контроллеров представления:
1.Выберите раскадровку основного интерфейса в XCode, как обычно (нет необходимости добавлять что-либо к вашему appDelegate
2. Добавьтеследуя вашему контроллеру основного вида в viewDidLoad
:
// If user is not logged in, show login view controller
if (!isLoggedIn) {
// Instantiate Login View Controller from storyboard
UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
UIViewController *loginVC = [mainSB instantiateViewControllerWithIdentifier:@"Login"];
// Set the Login View Controller's frame
loginVC.view.frame = self.view.bounds;
// Add login screen as a subview and as a child view controller
[self.view addSubview:loginVC.view];
[self addChildViewController:loginVC];
[loginVC didMoveToParentViewController:self];
// Maintain a reference to the Login screen so we can dismiss it later
_loginVC = loginVC;
}
3. После того, как пользователь войдет в систему, сообщите своему контроллеру основного вида, используя уведомления или делегата.Вы можете анимировать экран входа любым удобным для вас способом. Здесь я использую анимацию растворения:
// Animate out the category chooser
[UIView animateWithDuration:0.2 animations:^{
// Dissolve the login screen away
[_loginVC.view setAlpha:0];
} completion:^(BOOL finished) {
// Remove login screen as a child view controller
[_loginVC willMoveToParentViewController:nil];
[_loginVC.view removeFromSuperview];
[_loginVC removeFromParentViewController];
// nil out property
_loginVC = nil;
}];
И это все! Таким образом, контроллер основного вида всегда является корневым представлением вашего окна.В контроллере экран входа в систему освобождается после входа пользователя в систему, и при первом отображении экрана входа мерцание отсутствует.