如何在 Swift 3.0 中使用 Storyboard 在控制器之间传递数据?
How to pass data between controllers using Storyboard in Swift 3.0?
如何在 swift 3.0 中使用 UIStoryboard 在控制器之间传递数据?
我创建了 login (LoginViewController) 和 main (ViewController) 应用程序保持活动的页面如果用户没有注销。
到目前为止它有效。
我有这些 JSON 值 "login" 需要从 LoginViewController[=46 传递=] 变成 ViewController
有些人建议使用 执行和准备 segue。
有效,但只有从登录ViewController发送时才能显示该值。
ViewController 在页面 ViewController 处于活动状态时(当我 rebuild/clean 应用程序时)没有保存数据。
我的目标是在页面处于活动状态时将 "login" 数据保留在 ViewController 中,并在页面注销时清除 "login" 数据。
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()
}
}
有什么想法吗?
谢谢。
您可以将值存储在 LoginViewController 的 NSUserDefaults 中。如下所示:
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()
}
}
您需要重新调用登录服务,并在应用重启时传递数据。或者您可以将数据存储在 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
如何在 swift 3.0 中使用 UIStoryboard 在控制器之间传递数据?
我创建了 login (LoginViewController) 和 main (ViewController) 应用程序保持活动的页面如果用户没有注销。
到目前为止它有效。
我有这些 JSON 值 "login" 需要从 LoginViewController[=46 传递=] 变成 ViewController
有些人建议使用 执行和准备 segue。
有效,但只有从登录ViewController发送时才能显示该值。
ViewController 在页面 ViewController 处于活动状态时(当我 rebuild/clean 应用程序时)没有保存数据。
我的目标是在页面处于活动状态时将 "login" 数据保留在 ViewController 中,并在页面注销时清除 "login" 数据。
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()
}
}
有什么想法吗?
谢谢。
您可以将值存储在 LoginViewController 的 NSUserDefaults 中。如下所示:
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()
}
}
您需要重新调用登录服务,并在应用重启时传递数据。或者您可以将数据存储在 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