Swift : prepareForSegue with navigation controller

2019-01-21 10:20发布

问题:

I am developing an iOS application in Swift.

I want to send data from a view to an other one, using the prepareForSegue function.

However, my target view is preceded by a navigation controller, so it doesn't work.

How can I do this please ?

回答1:

In prepareForSegue access the target navigation controller, and then its top:

let destinationNavigationController = segue.destination as! UINavigationController
let targetController = destinationNavigationController.topViewController

From the target controller you can access its view and pass data.

In old - now obsolete - versions of Swift and UIKit the code was slightly different:

let destinationNavigationController = segue.destinationViewController as UINavigationController
let targetController = destinationNavigationController.topViewController


回答2:

Let's say you want to send data from the SendViewController to the ReceiveViewController :

  1. Add this to the SendViewController

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "segueShowNavigation"{
        var DestViewController = segue.destinationViewController as! UINavigationController
        let targetController = DestViewController.topViewController as! ReceiveViewController
        targetController.data = "hello from ReceiveVC !"
    }}
    
  2. Edit the identifier segue to "showNavigationController"

  1. In your ReceiveViewController add

this

var data : String = ""

override func viewDidLoad() {
    super.viewDidLoad()
    println("data from ReceiveViewController is \(data)")
}

Of course you can send any other type of data (int, Bool, JSON ...)



回答3:

Complete answer using optional binding and Swift 3 & 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let navigationVC = segue.destination as? UINavigationController, let myViewController = navigationVC.topViewController as? MyViewControllerClass {
        myViewController.yourProperty = myProperty
    }
}


回答4:

Here is the answer for Swift 3:

let svc = segue.destination as? UINavigationController

let controller: MyController = svc?.topViewController as! MyController
controller.myProperty = "Hi there"


回答5:

A one liner in Swift 3:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if let vc = segue.destination.childViewControllers[0] as? FooController {
    vc.variable = localvariable
  }
}