2017-02-06 5 views
-1

Как передавать данные между контроллером с помощью UIStoryboard в swift 3.0?Как передавать данные между контроллерами с помощью Storyboard в Swift 3.0?

Я создал логин (LoginViewController) и основной (ViewController) страницу, где приложения держать активным, если пользователь не выход из системы.

Пока это работает.

И у меня есть эти JSON значение «Войти», что необходимо передать из LoginViewController в ViewController

Некоторые люди предлагают использовать выполнения и подготовки SEGUE.

Работает, но значение может отображаться только в том случае, если оно отправлено из 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, если у вашего приложения есть данные или нет в userdefault, если они загрузили его. –

+0

Какие данные вы хотите сохранить? – User511

+0

Я хочу сохранить данные «входа» в ViewController. – AlotJai

ответ

-1

Вы можете сохранить значение в NSUserDefaults в LoginViewController. Как показано ниже:

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

и получить значение в ViewController как это (я предполагаю, что значение String):

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. 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){ 

// 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. Вы не сохраняете переменную «login» в UserDefaults. Это нормально, что ваш ViewController не может прочитать значение «login». А также я не вижу строку, в которой вы пытаетесь получить значение «login» из 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

Я уже добавляю UserDefaults в метод ViewController didLoad. но это не сработало. Я не знаю почему. кстати. спасибо за отзыв .. – AlotJai

+0

это не сработало. Прости. пустое значение – AlotJai

+0

Можете ли вы показать мне, какой код вы пишете для хранения и повторили входные данные? поэтому я могу помочь вам больше. –

Смежные вопросы