繁体   English   中英

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

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

我正在开发具有多个选项卡的iOS应用。 因此,我决定我的根视图Controller将成为具有2个视图的Tab Bar Controller。 我需要用户在应用程序启动后立即登录,因此我试图找出最佳方法来执行此操作。

在这里发布了其他类似的问题之后,我尝试了这两种方法:

  1. 在选项卡栏控制器顶部以模态视图显示登录屏幕

  2. 实例化登录视图控制器

通过使用NSUserDefaults中的UserisLoggedIn标志来完成此操作,该标志在用户每次登录或注销时都会设置。

我用两种方法都面临的问题是,在登录屏幕出现之前,选项卡栏中的第一个视图会快速闪烁。 我尝试解决此问题,如果用户未使用模式方法登录,则将选项卡栏的Alpha值设置为0,但是对于实例方法,它不起作用,在显示登录屏幕之前,它仍然闪烁。 无论如何,我发现这种解决方案很乏味,而且不是很优雅。

在iOS中必须有一种标准的方法来执行此操作,因为您有大量的应用程序首先显示登录屏幕,但是由于我是iOS编程的初学者,所以我仍然不知道该怎么做。

这是我的标签栏控制器中的一些代码:

第一种方法

标签栏控制器

 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)
        }
    }

登录视图控制器

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)

}

第二种方法,创建登录视图控制器的实例

标签栏中的第一视图

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)

}

登录视图控制器

@IBAction func login(sender: AnyObject) {

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

好的,这是我的诀窍。 我不知道这是正确的做法,但似乎可行。 就像约瑟夫·达菲(Joseph Duffy)提到的那样,我所做的就是将“登录”视图设置为委托中的rootviewcontroller,一旦成功登录,请切换回标签栏控制器作为rootviewcontroller。

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
 }

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
}

看一看类似问题的答案 解决方案是通过检查用户是否已登录并在必要时从情节提要中加载登录视图,来检查应用程序委托的application:didFinishLaunchingWithOptions:方法。

我创建了一个空白项目,添加了一个带有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)
    }
}

这显示登录屏幕,而看不到主屏幕。

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