2015-02-05 2 views
1

У меня в настоящее время проблема с моим логином. Логика есть все, но анимация из окна входа в основной вид выглядит странно.Reassign UIWindow rootViewController от UIViewController до UITabBarController, содержащего UINavigationControllers

Heres примечание стороны: Основной вид является UITabBarController с 5 UINavigationControllers и вид Логин просто UIViewController

Итак, сначала определить, в - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions, является ли текущий пользователь уже вошел в систему (я использую Parse для их обработки), если они не установили UIWindowsrootViewController в качестве контроллера входа. В противном случае установите для главного окна UIWindowsrootViewController.

Это прекрасно работает ... Предположим, что пользователь вошел в систему при запуске приложения. Хорошо, он показывает основной вид. Затем я выхожу, и все работает так, как ожидалось. Я переключаю 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 на короткое время, а затем возвращается к ожидаемому положению ... Вот два скриншота, когда происходит переход в систему на главный вид, затем, когда это делается ... During Transition After Transition

Я протестировал эту точную реализацию без UITabBarController, и он этого не делает. Эта сортировка GLITCH. Любые идеи, которые любой может передать?

Я хочу знать, можно ли это сделать для входа в систему login-> main и main-> login без необходимости использования основных методов viewDidAppear или viewWillAppear.

Например, в основных взглядов viewDidAppear,

if (user is logged in) 

     [self presentViewController:login animated:NO] 

Это приводит к тому, основной экран будет видно на короткое время до того, как LoginView показано, что я не хочу.

ответ

1

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

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

Единственным недостатком является то, что для входа в систему требуется непрозрачный фон.

+0

Я не использую xibs. Но это решение на самом деле кажется хорошим обходным решением ... Спасибо за ответ. Я не буду принимать его сейчас, но если никто не найдет решение этой маленькой проблемы в течение дня или около того. – jsetting32

+0

Итак, я принял ваш совет и вместо того, чтобы просто изменять контроллер корневого представления, я решил установить главный контроллер представления как контроллер корневого представления. Затем, если пользователь вошел в систему, не показывайте логин, если они выходят из системы, представляют логин ... Если пользователь не входит в приложение при запуске приложения, покажите логин через главный контроллер представления ... Нет ошибок присутствовали, и вопрос, который у меня был, исчез ...Не уверен, что так оно и должно быть сделано, но его работа! Я просто думаю, что есть тысячи способов реализовать поток входа, но было бы неплохо увидеть, как это делают другие – jsetting32

Смежные вопросы