我正在开发一个快速的应用程序,而当前的任务是将检索到的“用户”对象发送到下一个视图控制器。
它以Sign-In vc开头,我向服务器发出请求并获取适当的数据:
import UIKit
import Security
class SignInVC: UIViewController {
@IBOutlet weak var email_field: TextField!
@IBOutlet weak var password_field: TextField!
let httpHelper = HTTPHelper()
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func SignIn_Tapped(sender: AnyObject) {
// ...
if self.email_field.text!.characters.count > 0 &&
self.password_field.text!.characters.count > 0 {
makeSignInRequest(self.email_field.text!, pass: self.password_field.text!)
}
}
func makeSignInRequest(email:String, pass:String) {
let httpRequest = httpHelper.buildRequest("login", method: "POST",
authType: HTTPRequestAuthType.HTTPBasicAuth)
httpRequest.HTTPBody = "{\"email\":\"\(email)\",\"password\":\"\(pass)\"}".dataUsingEncoding(NSUTF8StringEncoding);
httpHelper.sendRequest(httpRequest, completion: {(data:NSData!, error:NSError!, description:NSMutableString!) in
do {
let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers ) as! NSDictionary
if let user = jsonData["user"]! as? NSDictionary {
let curr_user = User(
id: user["id"]! as! Int,
name: user["name"]! as! String,
pic_url: user["status"]! as! String
)
if let mainController = self.storyboard?.instantiateViewControllerWithIdentifier("NewTabViewController") as? UITabBarController {
print(curr_user)
self.navigationController?.pushViewController(mainController, animated: true)
}
} else {
print("error")
}
} catch {
print("error")
}
})
}
}
现在,我要做的就是将curr_user
对象传递给mainController
。但是我不知道怎么做。
我也一直在进行大量搜索,并且有很多人提出了“代表和协议”的建议,但是我还没有找到一个很好且相关的示例。因此,如果您也建议这样做,请提供一些有关我的代码的示例。
您可以根据自己希望如何处理这些数据的方式,选择几种将数据传递到其他视图的方法,我将为您解释每种方法,然后您可以选择最适合您需要的一种。
prepareForSegue
:方法如果您要保留数据进行1次segue转换,则建议使用此方法,这是在您需要prepareForSegue
在新视图中创建另一个视图之后将其再次传递给另一个视图的一个很好的原因。这是有关如何执行此操作的示例:
首先,您在两个视图中都创建了2个变量,其中1个用于发送(currentViewController.swift
),而1个用于接收(toViewyourGoingController.swift
)。
currentViewController.swift var dataToSend: AnyObject?
ViewYourGoingController.swift var dataToReceive: AnyObject?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//Check your segue, this way you can transfer different data to different view. also make sure the identifier match your segue.
if segue.identifier == "toViewYourGoing" {
//Initial your second view data control
let ExchangeViewData = segue.destinationViewController as! toViewyourGoingController
//Send your data with segue
ExchangeViewData.dataToReceive = dataToSend
}
}
现在,如果您希望在安装应用程序后一直保持数据有效,则此方法很好,一旦删除该应用程序,该方法将自动重置。您还可以根据需要选择更新密钥的值,这是NSUserDefault的操作方法:
我一直喜欢将NSUserDeafult注册为默认设置,很多人只是继续执行第二步而不进行注册。
在AppDelgate.swift中注册NSUserDefault
NSUserDefaults.standardUserDefaults().registerDefaults(["valueName": AnyObject])
将Value设置为NSUserDefault,这取决于您要存储的数据类型,如果您确实进行了注册,则应与您注册的数据类型匹配。(下面的布尔数据类型示例)
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "valueName") //Bool Data Type
将值设置为NSUserDefault后,请确保同步,这样它将立即更新,否则有机会更新。
NSUserDefaults.standardUserDefaults().synchronize()
接收值:由于我们设置了布尔值并注册了布尔值,因此它将接收布尔值。
let Variable: Bool! = NSUserDefaults.standardUserDefaults().boolForKey("valueName")
现在单例基本上是一个全局变量,您可以在任何视图中使用它们,但是某些开发人员会遇到一些错误和困难,使用它的风险由您自己承担,建议您在确定将大量使用该数据时使用此方法(仍然有风险),但是此方法就像是数据处理的女神:)。
创建一个NSObject
子类并调用它DataManager.swift
(我称其为数据管理器,因为它处理数据。),如下所示:
导入UIKit
class DataManager: NSObject {
//Store Data Globally
static var someData: Boo! //This Boolean, you can choose whatever you want.
}
这static
就是使您的数据保持活动状态的原因。
现在,您可以someData
像处理任何数据类型一样从任何地方存储和接收。
//Store
DataManager.someData = true
//Receive
print(DataManager.someData)
您也可以使用
钥匙扣Sergey Kargopolov将带您逐步了解如何使用第三方使用快速钥匙扣。否则,您将面临更大的挑战并自己创建一个:P。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句