简体   繁体   English

标签栏顶部的iOS登录屏幕模式或已实例化

[英]iOS Login Screen Modal on top of Tab Bar or Instantiated

I am developing an iOS App that has several Tabs. 我正在开发具有多个选项卡的iOS应用。 So I decided my root view Controller will be a Tab Bar Controller with 2 views. 因此,我决定我的根视图Controller将成为具有2个视图的Tab Bar Controller。 I need the user to login as soon as the application starts, so I'm trying to find out the best approach to do this. 我需要用户在应用程序启动后立即登录,因此我试图找出最佳方法来执行此操作。

Following other similar questions posted here I've tried this 2 approaches: 在这里发布了其他类似的问题之后,我尝试了这两种方法:

  1. Presenting the login screen as a Modal View on top of the Tab Bar Controller 在选项卡栏控制器顶部以模态视图显示登录屏幕

  2. Instantiating the Login view controller 实例化登录视图控制器

I've done this, by using a UserisLoggedIn flag in NSUserDefaults that is set every time the user logs in or logs out. 通过使用NSUserDefaults中的UserisLoggedIn标志来完成此操作,该标志在用户每次登录或注销时都会设置。

The problem I face with both approaches is that before the login screen appears there's a quick flickr of the first view in the Tab Bar. 我用两种方法都面临的问题是,在登录屏幕出现之前,选项卡栏中的第一个视图会快速闪烁。 I've tried to resolve this setting the alpha value of the Tab Bar to 0 if the user is not logged in for the modal approach, but for the instance approach it doesnt work, it still flickers before showing the login screen. 我尝试解决此问题,如果用户未使用模式方法登录,则将选项卡栏的Alpha值设置为0,但是对于实例方法,它不起作用,在显示登录屏幕之前,它仍然闪烁。 Anyway, I find this solution tedious and not really elegant. 无论如何,我发现这种解决方案很乏味,而且不是很优雅。

There must be a standard approach for doing this in iOS, since you have loads of apps that present first a login screen, but since I am a beginner with iOS Programming I still don't know how to do it. 在iOS中必须有一种标准的方法来执行此操作,因为您有大量的应用程序首先显示登录屏幕,但是由于我是iOS编程的初学者,所以我仍然不知道该怎么做。

Here's some code from my Tab bar controller: 这是我的标签栏控制器中的一些代码:

1st Approach 第一种方法

Tab Bar Controller 标签栏控制器

 override func viewDidLoad() {
        super.viewDidLoad()
        view.alpha = 0

        let defaults = NSUserDefaults.standardUserDefaults()

        if defaults.objectForKey("userLoggedIn") as NSString == "loggedIn"{
            view.alpha = 1.0
        }

      }


override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(false)
        self.showLoginView()

    }



func showLoginView(){

        let defaults = NSUserDefaults.standardUserDefaults()

        if defaults.objectForKey("userLoggedIn") == nil{
            self.performSegueWithIdentifier("loginView", sender: self)
        }
    }

Login View Controller 登录视图控制器

func updateUserLoggedInFlag() {
        // Update the NSUserDefaults flag
        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject("loggedIn", forKey: "userLoggedIn")
        defaults.synchronize()
    }

@IBAction func login(sender: AnyObject) {

//Do my login here...
//If login successful:

    self.performSegueWithIdentifier("dismissLogin", sender: self)

}

2nd Approach, Creating an Instance of the Login View Controller 第二种方法,创建登录视图控制器的实例

1st View in the Tab Bar 标签栏中的第一视图

override func viewDidAppear(animated: Bool){
        super.viewDidAppear(true)

        let defaults = NSUserDefaults.standardUserDefaults()
        if defaults.objectForKey("userLoggedIn") == nil{

            let loginController: LoginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
            self.tabBarController?.presentViewController(loginController, animated: false, completion: nil)

} }

Login View Controller 登录视图控制器

@IBAction func login(sender: AnyObject) {

//Do my login here...
    //If login successful:
    self.dismissViewControllerAnimated(true, completion: nil)
}

OK here is what did the trick for me. 好的,这是我的诀窍。 I don't know if it's the right thing to do, but it seems to work. 我不知道这是正确的做法,但似乎可行。 Like Joseph Duffy mentioned all I did was to set the Login view as the rootviewcontroller in the delegate, and once I was succesfully logged in, switch back to the tab bar controller as rootviewcontroller. 就像约瑟夫·达菲(Joseph Duffy)提到的那样,我所做的就是将“登录”视图设置为委托中的rootviewcontroller,一旦成功登录,请切换回标签栏控制器作为rootviewcontroller。

Code in AppDelegate: AppDelegate中的代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let defaults = NSUserDefaults.standardUserDefaults()
            if defaults.objectForKey("userLoggedIn") == nil{         
                showLogin()   
            }

}

 func showLogin() {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let loginViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
        self.window?.makeKeyAndVisible()
        self.window?.rootViewController = loginViewController
 }

Code in LoginViewController LoginViewController中的代码

@IBAction func login(sender: AnyObject) {
   //Do my login here...
   //If login successful:
     let storyboard = UIStoryboard(name: "Main", bundle: nil)
     let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
     self.dismissViewControllerAnimated(true, completion: nil)
     appDelegate.window?.rootViewController = storyboard.instantiateViewControllerWithIdentifier("tabBarID") as TabBarController
}

Take a look at a similar question's answer . 看一看类似问题的答案 The solution is to do this check in your app delegate's application:didFinishLaunchingWithOptions: method by checking if the user is logged in and loading the login view from a storyboard when necessary. 解决方案是通过检查用户是否已登录并在必要时从情节提要中加载登录视图,来检查应用程序委托的application:didFinishLaunchingWithOptions:方法。

I have created a blank project, added a view controller with a storyboard identifier of loginScreen and have the following code in the app delegate: 我创建了一个空白项目,添加了一个带有loginScreen情节loginScreen标识符的视图控制器,并在应用程序委托中包含以下代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    self.showLogin()

    return true
}

func showLogin() {
    //loginScreen
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let loginViewController = storyboard.instantiateViewControllerWithIdentifier("loginScreen") as UIViewController
    if let window = self.window {
        window.makeKeyAndVisible()
        window.rootViewController?.presentViewController(loginViewController, animated: false, completion: nil)
    }
}

This shows the login screen and the main screen is not seen. 这显示登录屏幕,而看不到主屏幕。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
                // Override point for customization after application launch.

         let defaults = NSUserDefaults.standardUserDefaults()
          if defaults.objectForKey("userLoggedIn") == nil{

          showLoginView()

   }

func showLoginView(){

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let loginViewController: LoginViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
        self.window?.makeKeyAndVisible()
        self.window?.rootViewController?.presentViewController(loginViewController, animated: true, completion: nil)
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM