如何使用segues在视图控制器之间传输数据
问题描述:
我试图使用prepare(for segue:)
函数传递数据,但它在第二个VC中显示为零。我做错了什么?如何使用segues在视图控制器之间传输数据
class ViewController: UIViewController {
var first : [String] = []
@IBOutlet weak var passField: UITextField!
@IBOutlet weak var userID: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func login(_ sender: Any) {
let user : String = self.userID.text!
let password : String = self.passField.text!
if user != "" && password != "" {
let postString = ["username":user, “password”: password]
var request = URLRequest(url:URL(string:"http://mydomainhere.com/api/login")!)
request.httpMethod = "POST"
request.httpBody = try! JSONSerialization.data(withJSONObject: postString, options:.prettyPrinted)
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
if error != nil {
print("error=\(error)")
return
}
do {
if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any] {
let firstName = json["first_name"] as? String
let lastName = json["last_name"] as? String
self.first.append(firstName!) //putting into Array
self.performSegue(withIdentifier: "loginSegue", sender: self)
}
} catch {
print(error)
}
}
}
}
// data transfer to another controller
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "loginSegue" {
let secondController = segue.destination as? SecondVC
secondController?.name = first //passing to next VC //* here having the issue its not passing the data to next VC
print(first) // here first is printing perfectly
}
}
}
// second View Controller
class SecondVC: UIViewController {
var menu_vc : MenuViewController!
var name : [String]? // passing to this Array
override func viewDidLoad() {
super.viewDidLoad()
print(name) // here printing nil
}
}
答
正如@Sweeper建议,它很可能是你的目的地视图控制器嵌入UINavigationViewController,因此你segue.destination是实际上是一个UINavigationViewController,而不是SecondVC。
你可以试试这个代码:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
var destinationViewController = segue.destination
if let navigationController = destinationViewController as? UINavigationController {
destinationViewController = navigationController.visibleViewController ?? destinationViewController
}
if let secondController = destinationViewController as? SecondVC {
secondController?.name = first
}
}
当然代码的前四行可以在适当的功能(如果UIViewController中的延伸甚至更好)进行重构。
如果解决了这个问题,您可以观看cs193p Stanford iOS课程以获取更多详细信息。 特别是手表https://www.youtube.com/watch?v=HQrXM2zUPvY&index=6&list=PLPA-ayBrweUz32NSgNZdl0_QISw-f12Ai从30:20开始。
+0
很棒。完美地工作。谢谢! –
答
一切似乎完美与下面的代码片段
var first : [String] = []
@IBAction func btnTapped(_ sender: Any) {
let firstName = "iOS Geek"
self.first.append(firstName)
self.performSegue(withIdentifier: "MovetoSecVC", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MovetoSecVC"{
let secVC = segue.destination as! SecondVC
secVC.name = first
print(first) // it'll print here ["iOS Geek"]
}
}
// Your Second View Controller
class SecondVC: UIViewController {
var menu_vc : MenuViewController!
var name : [String]? // passing to this Array
override func viewDidLoad() {
super.viewDidLoad()
print(name!) // it'll print here ["iOS Geek"]
}
}
在prepareForSegue中设置一个断点,然后逐步查看发生了什么。视图控制器downcast可能失败。 – Paulw11
@ Paulw11感谢您的回复,但我没有得到你。你能不能给我一些建议我实际需要做的事情。 –
我不能建议代码。你所看到的代码通常是正确的。了解如何使用内置于Xcode中的功能强大的调试器来浏览您的应用,并了解它在做什么。 – Paulw11