如何在Tabbar控制器之前显示登录视图?

3

我目前正在开发一款iOS应用程序,用户可以查看他们在网站上创建的账户。

我希望用户在登录后可以查看他们的账户。因此,我需要一个登陆界面作为第一个界面。 当用户成功登录后,登陆界面将会消失并且第一个视图控制器将会加载数据。

我该如何实现?

3个回答

6

在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];


    }
}

非常感谢!当用户登录后,我调用dismissmodelviewcontroller。如果我需要在第一个选项卡上进行请求,只有在登录取消时才能这样做,我可以在viewdidload中完成吗? - Astram56
如果您在viewDidLoad()中发出请求,它将在viewDidAppear()和LoginViewController之前发送。您可以在ViewDidAppear()中提供它,但它将在每次视图出现时调用,而不像viewDidLoad只调用一次。您可以尝试并选择最好的方法。 - Shaheen M Basheer

3

您可以使用presentModalViewController(_:animated:completion:)方法来呈现登录视图控制器。

在成功登录后,使用dismissModalViewControllerAnimated(_:completion:)方法关闭该视图控制器,这样您就可以看到标签栏。


谢谢,但我在AppDelegate中做这个?如果需要再次显示登录视图,如果用户注销,我可以在其他视图控制器中的任何地方调用presentmodalviewcontroller吗? - Astram56
@Axton56 在 rootview 的 view will appear 方法中展示你的登录视图。然后在登录按钮点击时,使用 NSUserDefaults 保存一些值。当用户点击注销时,删除该 userdefault 并将 tabbar 的 selectedindex 更改为 1。因此,view will appear 方法被调用并检查如果 userdefault valueforkey 为空,则打开登录视图。否则不打开。我已经做到了。这会帮助你的。 - ChintaN -Maddy- Ramani

1
我尝试了模态视图控制器方法(即,在启动时以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)上,导航栏的“跳跃”不会发生,而是会快速(但温和地)动画将其放置到位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接