如何使用segue在视图控制器之间传输数据

时间:2017-06-04 05:03:39

标签: ios swift

我正在尝试使用prepare(for segue:)函数传递数据,但它在第二个VC中显示为nil。我做错了吗?

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 
    }
}

2 个答案:

答案 0 :(得分:1)

正如@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课程以获取更多详细信息。 特别是从30:20标记开始观察https://www.youtube.com/watch?v=HQrXM2zUPvY&index=6&list=PLPA-ayBrweUz32NSgNZdl0_QISw-f12Ai

答案 1 :(得分: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"]
    }
}