我目前正在开发一款iOS应用程序,用户可以查看他们在网站上创建的账户。
我希望用户在登录后可以查看他们的账户。因此,我需要一个登陆界面作为第一个界面。 当用户成功登录后,登陆界面将会消失并且第一个视图控制器将会加载数据。
我该如何实现?
我目前正在开发一款iOS应用程序,用户可以查看他们在网站上创建的账户。
我希望用户在登录后可以查看他们的账户。因此,我需要一个登陆界面作为第一个界面。 当用户成功登录后,登陆界面将会消失并且第一个视图控制器将会加载数据。
我该如何实现?
在FirstViewController的viewDidAppear方法中添加以下代码,以在选项卡之前显示登录视图控制器。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
AppDelegate * delegate = [[UIApplication sharedApplication] delegate];
if (!delegate.login) { // BOOL value to know if user is logged in or not.If user succefully logged in set value of this as YES else NO.
LoginViewController * lvc = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self presentModalViewController:lvc animated:NO];
[lvc release];
}
}
您可以使用presentModalViewController(_:animated:completion:)
方法来呈现登录视图控制器。
在成功登录后,使用dismissModalViewControllerAnimated(_:completion:)
方法关闭该视图控制器,这样您就可以看到标签栏。
animated:false
的方式模态地呈现登录视图控制器),但存在问题:如果您尝试太早呈现它(即在viewWillAppear(animated:)
中),它不会显示。如果您尝试太晚(即在viewDidAppear(animated:)
中),底层视图控制器会“透过”一瞬间显示出来(至少在iOS 8上是这样)。
相反地,我启动我的应用程序时将登录视图控制器设置为窗口的根视图控制器(设置为主故事板的初始视图控制器),一旦身份验证成功,我就会将根视图控制器“交换”为我的应用程序的主选项卡栏控制器(我从单独的故事板中懒惰地实例化)。// Run this code when authentication succeeds:
UIView.transitionWithView(self.view.window,
duration: 0.3,
options: UIViewAnimationOptions.TransitionCrossDissolve,
animations: {
window.rootViewController = tabBarController
},
completion: nil
)
然而,我遇到了一个问题,就是我插入的选项卡栏在当前选中的选项卡中包含了一个导航控制器,在过渡期间,导航栏会向上移动并“下溢”应用程序的状态栏,直到动画完成才会跳回正确的位置。非常烦人... 我通过在包含在导航控制器中的子视图控制器中添加这行代码来解决这个问题:
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
self.navigationController?.navigationBar.layer.removeAllAnimations()
}
(修复取自这里)
更新:我注意到在一些模拟器(iPhone 6+,iOS 9.0)上,导航栏的“跳跃”不会发生,而是会快速(但温和地)动画将其放置到位。