У меня в настоящее время проблема с моим логином. Логика есть все, но анимация из окна входа в основной вид выглядит странно.Reassign UIWindow rootViewController от UIViewController до UITabBarController, содержащего UINavigationControllers
Heres примечание стороны: Основной вид является UITabBarController
с 5 UINavigationControllers
и вид Логин просто UIViewController
Итак, сначала определить, в - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
, является ли текущий пользователь уже вошел в систему (я использую Parse
для их обработки), если они не установили UIWindows
rootViewController
в качестве контроллера входа. В противном случае установите для главного окна UIWindows
rootViewController
.
Это прекрасно работает ... Предположим, что пользователь вошел в систему при запуске приложения. Хорошо, он показывает основной вид. Затем я выхожу, и все работает так, как ожидалось. Я переключаю UIWindows RootViewController, запустив этот метод:
- (void)showLogin {
self.activity = nil;
self.chat = nil;
self.create = nil;
self.notification = nil;
self.more = nil;
self.loginViewController = nil;
if (!self.loginViewController) { // this check is redundant i feel lol
self.loginViewController = [[PHLoginRegisterViewController alloc] init];
}
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.window.rootViewController = self.loginViewController;
} completion:^(BOOL finished) {
self.activity = [[PHActivityViewController alloc] init];
self.chat = [[PHGlobalChatViewController alloc] init];
self.notification = [[PHNotificationsViewController alloc] init];
self.more = [[PHMoreViewController alloc] init];
[self.tabBarController setViewControllers:@[[[UINavigationController alloc] initWithRootViewController:self.activity],
[[UINavigationController alloc] initWithRootViewController:self.chat],
[[UINavigationController alloc] init],
[[UINavigationController alloc] initWithRootViewController:self.notification],
[[UINavigationController alloc] initWithRootViewController:self.more]]];
[self.tabBarController setSelectedIndex:0];
}];
}
Ладно, так что вид Логин теперь отображается с хорошим переходом ... Потом, когда я пытаюсь войти, все работает отлично, но когда переход происходит login-> main, весь основной вид (за исключением позиции UITabBar
из UITabBarController
) в основном установлен -20px на короткое время, а затем возвращается к ожидаемому положению ... Вот два скриншота, когда происходит переход в систему на главный вид, затем, когда это делается ...
Я протестировал эту точную реализацию без UITabBarController, и он этого не делает. Эта сортировка GLITCH. Любые идеи, которые любой может передать?
Я хочу знать, можно ли это сделать для входа в систему login-> main и main-> login без необходимости использования основных методов viewDidAppear
или viewWillAppear
.
Например, в основных взглядов viewDidAppear
,
if (user is logged in)
[self presentViewController:login animated:NO]
Это приводит к тому, основной экран будет видно на короткое время до того, как LoginView показано, что я не хочу.
Я не использую xibs. Но это решение на самом деле кажется хорошим обходным решением ... Спасибо за ответ. Я не буду принимать его сейчас, но если никто не найдет решение этой маленькой проблемы в течение дня или около того. – jsetting32
Итак, я принял ваш совет и вместо того, чтобы просто изменять контроллер корневого представления, я решил установить главный контроллер представления как контроллер корневого представления. Затем, если пользователь вошел в систему, не показывайте логин, если они выходят из системы, представляют логин ... Если пользователь не входит в приложение при запуске приложения, покажите логин через главный контроллер представления ... Нет ошибок присутствовали, и вопрос, который у меня был, исчез ...Не уверен, что так оно и должно быть сделано, но его работа! Я просто думаю, что есть тысячи способов реализовать поток входа, но было бы неплохо увидеть, как это делают другие – jsetting32