2017-02-06 5 views
-1

スウィフト3.0でUIStoryboardを使用してコントローラ間でデータをやりとりする方法は?Swift 3.0のStoryboardを使用してコントローラ間でデータを渡す方法は?

は、私は、ユーザーがログアウトしなかった場合、アプリケーションがアクティブに保つログイン(LoginViewController)とメイン(ViewControllerを)ページを作成しました。

これまでのところ動作します。

そして私は人々のいくつかは実行し、準備セグエを使用することをお勧め

のViewControllerLoginViewControllerから渡す必要があり、「ログイン」をこれらのJSON値を持っています。

これは機能しますが、値はLoginViewControllerから送信された場合にのみ表示できます。

ViewControllerがアクティブなとき(私がアプリケーションを再構築/クリーンアップするとき)、ViewControllerはデータを保持しませんでした。

私の目標は、ページがアクティブなときにViewControllerに「ログイン」データを保存し、ページがログアウトしたときに「ログイン」データをクリアすることです。

LoginViewController.swift

import UIKit 
class LoginViewController: UIViewController { 

    @IBOutlet var _loginLbl: UITextField! 
    @IBOutlet var _pwLbl: UITextField! 
    @IBOutlet var login_button: UIButton! 

    @IBOutlet var outputLbl: UILabel! 

    var login: String! 
    var pw: String! 

    override func viewDidLoad() {super.viewDidLoad()} 

    @IBAction func loginData(_ sender: Any) { 
     login = _loginLbl.text 
     pw = _pwLbl.text 

      let url = URL(string: "http://localhost/login.php") 
      let session = URLSession.shared 

      let request = NSMutableURLRequest(url: url! as URL) 
      request.httpMethod = "POST" 

      let LoginDataToPost = "login=\(login!)&pw=\(pw!)" 
      request.httpBody = LoginDataToPost.data(using: String.Encoding.utf8) 

      let task = session.dataTask(with: request as URLRequest, completionHandler: { 
       (data, response, error) in 
       if error != nil { 
        return 
       } 
       else { 
        do { 
         if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String] 
         { 
          DispatchQueue.main.async 
          { 
           let message = Int(json["message"]!) 
           let login = json["login"] 

           if(message == 1) { 
            UserDefaults.standard.set(true, forKey: "isUserLoggedIn") 
            UserDefaults.standard.synchronize(); 
            self.dismiss(animated: true, completion: nil) 

            let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
            let appDelegate = UIApplication.shared.delegate as! AppDelegate 
            appDelegate.window?.rootViewController = myViewController 
            appDelegate.window?.makeKeyAndVisible() 

            self.outputLbl.text = login; 

            return 
           } 
           else { } 
          } 
         } 
         else { } 
        } catch let jsonParse {} 
       } 
      }) 
      task.resume() 
     } 
    } 
} 

ViewController.swift

import UIKit 
class ViewController: UIViewController { 
    @IBOutlet var loginLbl: UILabel! 
    var login: String! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    let preferences = UserDefaults.standard 

     if(preferences.object(forKey: "isUserLoggedIn") != nil){ 
      loginLbl.text = login 
     } 
     else { 

     } 
    } 
    override func viewDidAppear(_ animated: Bool) { 
     let isUserLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn") 
     if(!isUserLoggedIn){ 
      self.performSegue(withIdentifier: "loginview", sender: self) 
     } 
    } 
    @IBAction func logoutData(_ sender: Any) { 
     UserDefaults.standard.set(false, forKey: "isUserLoggedIn"); 
     UserDefaults.standard.synchronize(); 
     let loginViewController = self.storyboard!.instantiateViewController(withIdentifier: "loginview") as! LoginViewController 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     appDelegate.window?.rootViewController = loginViewController 
     appDelegate.window?.makeKeyAndVisible() 
    } 

} 

任意のアイデア?

ありがとうございました。

+0

UserDefaults.standard.set(login, forKey: "loginResponse") 

あなたは以下のようにあるコントローラから別のコントローラにデータを渡すことができますdidlaunchwithfinishあなたのアプリがデータを持っているかどうか、もしそれがロードされていれば、userdefaultにあります。 –

+0

保存したいデータはありますか? – User511

+0

"ログイン"データをViewControllerに保存したい。 – AlotJai

答えて

-1

NSUserDefaultsの値をLoginViewControllerに保存することができます。以下のように:

UserDefaults.standard.set(login, forKey: "loginJSONValue") 

そして、このようなのViewControllerの値を取得します(私は値が文字列であると仮定):

textField1.text = UserDefaults.standard.object(forKey: "loginJSONValue") as? String 

LoginViewController.swift

import UIKit 
class LoginViewController: UIViewController { 

    @IBOutlet var _loginLbl: UITextField! 
    @IBOutlet var _pwLbl: UITextField! 
    @IBOutlet var login_button: UIButton! 

    @IBOutlet var outputLbl: UILabel! 

    var login: String! 
    var pw: String! 

    override func viewDidLoad() {super.viewDidLoad()} 

    @IBAction func loginData(_ sender: Any) { 
     login = _loginLbl.text 
     pw = _pwLbl.text 

      let url = URL(string: "http://localhost/login.php") 
      let session = URLSession.shared 

      let request = NSMutableURLRequest(url: url! as URL) 
      request.httpMethod = "POST" 

      let LoginDataToPost = "login=\(login!)&pw=\(pw!)" 
      request.httpBody = LoginDataToPost.data(using: String.Encoding.utf8) 

      let task = session.dataTask(with: request as URLRequest, completionHandler: { 
       (data, response, error) in 
       if error != nil { 
        return 
       } 
       else { 
        do { 
         if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String] 
         { 
          DispatchQueue.main.async 
          { 
           let message = Int(json["message"]!) 
           let login = json["login"] 

           if(message == 1) { 
            UserDefaults.standard.set(true, forKey: "isUserLoggedIn") 
            UserDefaults.standard.set(login, forKey: "loginJSONValue") 
            UserDefaults.standard.synchronize(); 
            self.dismiss(animated: true, completion: nil) 

            let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
            let appDelegate = UIApplication.shared.delegate as! AppDelegate 
            appDelegate.window?.rootViewController = myViewController 
            appDelegate.window?.makeKeyAndVisible() 

            self.outputLbl.text = login; 

            return 
           } 
           else { } 
          } 
         } 
         else { } 
        } catch let jsonParse {} 
       } 
      }) 
      task.resume() 
     } 
    } 
} 

のViewController。スウィフト

import UIKit 
class ViewController: UIViewController { 
    @IBOutlet var loginLbl: UILabel! 
    var login: String! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    let preferences = UserDefaults.standard 

     if(preferences.object(forKey: "isUserLoggedIn") != nil){ 

// let isUserLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn") 
      let isUserLoggedIn = UserDefaults.standard.object(forKey: "isUserLoggedIn") as Bool 
    // your login data is below. do what you want to do 
       login = UserDefaults.standard.object(forKey: "loginJSONValue") as String 
       if(!isUserLoggedIn){ 
        self.performSegue(withIdentifier: "loginview", sender: self) 
       } 
      loginLbl.text = login 
     } 
     else { 

     } 
    } 
    override func viewDidAppear(_ animated: Bool) { 

     } 

     @IBAction func logoutData(_ sender: Any) { 
      UserDefaults.standard.set(false, forKey: "isUserLoggedIn"); 
// After logging out, you can set empty to login data. 
UserDefaults.standard.set("", forKey: "loginJSONValue"); 
      UserDefaults.standard.synchronize(); 
      let loginViewController = self.storyboard!.instantiateViewController(withIdentifier: "loginview") as! LoginViewController 
      let appDelegate = UIApplication.shared.delegate as! AppDelegate 
      appDelegate.window?.rootViewController = loginViewController 
      appDelegate.window?.makeKeyAndVisible() 
     } 

    } 
+0

フィードバックに感謝します。私はまずそれを試してみるでしょう。 。 :) – AlotJai

+0

ViewControllerでLoginViewControllerの値を保存できない理由がわかりません。 。 – AlotJai

+0

コードでは、 "isUserLoggedIn"値をUserDefaultsに保存します。 UserDefaultsに "login"変数を保存していません。 ViewControllerが「ログイン」値を読み取ることができないのは通常のことです。また、私はUserDefaultsから "ログイン"値を取得しようとしている行を見ることができません。あなたは "isUserLoggedIn"を読んで、正しいことをしています。私のコードを試して、それは動作します。私は自分のアプリケーションで使っています。 –

-1

ログインサービスをもう一度呼び出すと、アプリケーションを再起動するときにデータを渡す必要があります。 UserDefaultにデータを格納して再利用することもできます。ただ、userdefaultにモデルクラスや辞書、およびそのモデルクラスや辞書など、あなたの応答を格納し、でおき、それをチェックし

let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
var loginResponse = UserDefaults.standard.get(forKey:"loginResponse") 
myViewController.your_object = loginResponse 
+0

私はすでにViewController didLoadメソッドにUserDefaultsを追加しています。しかしそれは仕事をしなかった。どうしてか分かりません。 btw。フィードバックのおかげで。 – AlotJai

+0

それは動作しませんでした。ごめんなさい。空の値 – AlotJai

+0

あなたはストアと再試行されたログインデータのためにあなたが書いたコードを私に見せることができますか?だから私はもっとあなたを助けることができます。 LoginViewController.swiftの –

関連する問題