将 UIWindow rootViewController 从 UIViewController 重新分配给包含 UINavigationControllers 的 UITabBarController

Reassign UIWindow rootViewController from UIViewController to UITabBarController containing UINavigationControllers

我目前的登录流程有问题。逻辑都在那里,但是从登录视图到主视图的动画很奇怪。

附注:主视图是 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];
                    }];
}

好的,所以登录视图现在显示了一个很好的过渡...然后当我尝试登录时,一切正常,但是当过渡发生时登录->主视图,整个主视图(除了UITabBarController) 的 UITabBar 的位置基本上暂时设置为 -20px,然后重置为预期位置...这是登录过渡到主视图时的两个屏幕截图,然后当它完成转换时......

我已经在没有 UITabBarController 的情况下测试了这个确切的实现,但它没有这样做。这有点 GLITCH 问题。任何人都可以传递任何想法?

我想知道是否可以在不执行 main 的 viewDidAppearviewWillAppear 方法的情况下执行此登录->main 和 main->login 转换。

例如,在主视图中 viewDidAppear

if (user is logged in)

        [self presentViewController:login animated:NO]

这会导致在显示登录视图之前先看到主屏幕一小段时间,这是我不希望看到的。

我认为问题是在你的转换完成之前,自动布局过程没有被触发,所以你的视图是它在你的 xib 设计中的位置。

我有一个解决这个问题的想法,每当应用程序启动时,您都将主视图控制器用作根视图控制器,如果您需要登录,则在主视图控制器的 viewDidLoad 中加载登录视图控制器并将它的视图添加为主视图控制器的顶部子视图,这将解决演示文稿的问题。

唯一的缺点是您的登录视图需要不透明的背景。