【发布时间】:2017-06-23 00:04:53
【问题描述】:
swift 3.0 中如何使用 UIStoryboard 在控制器之间传递数据?
我创建了 login (LoginViewController) 和 main (ViewController) 页面,如果用户没有注销,应用程序会在其中保持活动状态。
到目前为止它有效。
我有这些 JSON 值 "login" 需要从 LoginViewController 传递到 ViewController
有些人建议使用perform and prepare 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()
}
}
有什么想法吗?
谢谢。
【问题讨论】:
-
只需将您的响应存储为模型类或字典,并将该模型类或字典存储到 userdefault 中,并在每次 didlaunchwithfinish 时检查它,如果您的应用在 userdefault 中是否有数据,是否已加载。
-
你要保存什么数据?
-
我想将“登录”数据保存到 ViewController。
-
@RahulPatel 我应该在哪个页面上设置该数据?
-
@AlotJai 在 LoginViewController 下 if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String] { } 我认为您获得了一些基于特定用户登录的用户数据。
标签: ios swift3 xcode8 uistoryboard uistoryboardsegue