在标签栏或实例化之上的iOS登录屏幕模式

时间:2015-03-20 10:02:12

标签: ios iphone swift tabs

我正在开发一个有几个标签的iOS应用程序。所以我决定我的根视图Controller将是一个带有2个视图的Tab Bar Controller。 我需要用户在应用程序启动后立即登录,因此我正在尝试找到执行此操作的最佳方法。

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

  1. 在标签栏控制器顶部将登录屏幕显示为模态视图

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

  3. 我已经通过在NSUserDefaults中使用每次用户登录或注销时设置的UserisLoggedIn标志来完成此操作。

    我使用这两种方法遇到的问题是,在登录屏幕出现之前,可以快速点击标签栏中的第一个视图。 我试图将此设置将Tab Bar的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)
    }
    

3 个答案:

答案 0 :(得分:3)

好的,这就是我的诀窍。我不知道这是否正确,但似乎有效。就像Joseph Duffy所提到的那样,我所做的就是将Login视图设置为委托中的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
}

答案 1 :(得分:2)

看看similar question's answer。解决方案是通过检查用户是否已登录并在必要时从故事板加载登录视图来检查应用程序委托的application:didFinishLaunchingWithOptions:方法。

我创建了一个空白项目,添加了一个故事板标识为loginScreen的视图控制器,并在app delegate中包含以下代码:

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

显示登录屏幕,未看到主屏幕。

答案 2 :(得分:2)

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