2017-02-06 5 views
-1

스위프트 3.0에서 UIStoryboard를 사용하는 컨트롤러간에 데이터를 전달하는 방법은 무엇입니까?Swift 3.0에서 Storyboard를 사용하여 컨트롤러간에 데이터를 전달하는 방법은 무엇입니까?

나는 사용자가 로그 아웃하지 않은 경우 응용 프로그램이 활성 상태로 유지 로그인 (LoginViewController) 및 주요 (의 ViewController) 페이지를 만들었습니다.

지금까지 작동합니다.

는 그리고 나는 사람들 중 일부는 수행 사용 SEGUE을 준비하는 것이 좋습니다 의 ViewController

"로그인"이 필요LoginViewController에서 전달되는 이러한 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

그냥 모델 클래스 또는 사전 및 userdefault에 그 모델 클래스 또는 사전과 같은 응답을 저장하고,에서 모든 그것을 확인 didlaunchwithfinish는 앱에 데이터가 있거나 사용자 정의하지 않은 경우로드합니다. –

+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에 저장하지 않습니다. ViewController가 "로그인"값을 읽을 수 없다는 것은 정상입니다. 또한 내가 UserDefaults에서 "로그인"값을 얻으려고하는 줄을 볼 수 없습니다. 당신은 "isUserLoggedIn"을 읽고 그것을 제대로하고 있습니다. 내 코드를 사용해 보면 효과가있다. 내 응용 프로그램에서 사용하고 있습니다. –

-1

응용 프로그램을 다시 시작하면 로그인 서비스를 다시 호출하고 데이터를 전달해야합니다. 또는 UserDefault에 데이터를 저장하고 다시 사용할 수 있습니다.

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

당신은 다음과 같이 하나의 컨트롤러에서 다른 컨트롤러로 데이터를 전달할 수 있습니다

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를 추가합니다. 그러나 그것은 일을 didnt한다. 나는 이유를 모른다. btw. 피드백 덕분에 .. – AlotJai

+0

그것은 작동하지 않았다. 죄송합니다. 빈 값 – AlotJai

+0

저장 및 재 시도 로그인 데이터에 대해 작성한 코드를 표시 할 수 있습니까? 그래서 내가 더 너를 도울 수있어. LoginViewController.swift의 –