簡體   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