Øyvind Hauge mi ha battuto alla stessa soluzione metodo, ma come avevo già iniziato con una risposta più dettagliata, ti inserirlo pure.
Diciamo che il vostro due controller di vista sono denominati come segue:
- punto di master/ingresso:
ViewController
(vcA)
- vista secondario:
ViewControllerB
(vcB)
si imposta l'segue da (vcA) -> (vcB)
come hai fatto nell'esempio
/* in ViewController.swift */
// ...
// segue ViewController -> ViewControllerB
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
{
if segue.identifier == "viewNext" {
let viewControllerB = segue.destinationViewController as! ViewControllerB
viewControllerB.dataPassed = labelOne.text
}
}
Il passo alquanto difficile è poi che, con questo metodo, la segue utilizzato per passare dati indietro da(vcB)
a(vcA)
è anche aggiunti alla fonte di (vcA)
, come metodo @IBAction
(piuttosto che, come potrebbe essere previsto, aggiunto alla fonte di (vcB)
).
/* in ViewController.swift */
// ...
// segue ViewControllerB -> ViewController
@IBAction func unwindToThisView(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? ViewControllerB {
dataRecieved = sourceViewController.dataPassed
}
}
È da allora in poi collegare ad esempio, un pulsante in (vcB)
a questa azione rilassarsi nel (vcA)
via manuale Exit
segue in (vcB)
:
Seguono un esempio completo di passare il testo da (vcA)
a (vcB)
; (eventualmente) modificando quel testo tramite UITextField
, restituendo infine il testo (eventualmente) modificato a (vcA)
.
(vcA)
fonte:
/* ViewController.swift: Initial view controller */
import UIKit
class ViewController: UIViewController {
var dataRecieved: String? {
willSet {
labelOne.text = newValue
}
}
@IBOutlet weak var labelOne: UILabel!
@IBAction func buttonOne(sender: UIButton) {
performSegueWithIdentifier("viewNext", sender: self)
}
// set default labelOne text
override func viewDidLoad() {
super.viewDidLoad()
labelOne.text = "Default passed data"
}
// segue ViewController -> ViewControllerB
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
{
if segue.identifier == "viewNext" {
let viewControllerB = segue.destinationViewController as! ViewControllerB
viewControllerB.dataPassed = labelOne.text
}
}
// segue ViewControllerB -> ViewController
@IBAction func unwindToThisView(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? ViewControllerB {
dataRecieved = sourceViewController.dataPassed
}
}
}
(vcB)
fonte (notare che il UITextFieldDelegate
delegato qui viene utilizzato solo per "localmente" mutare il valore della proprietà dataPassed
, che verrà restituita al (vcA)
e assegnato a dataRecieved
proprietà di quest'ultimo)
/* ViewControllerB.swift */
import UIKit
class ViewControllerB: UIViewController, UITextFieldDelegate {
var dataPassed : String?
@IBOutlet weak var textField: UITextField!
// set default textField text to the data passed from previous view.
override func viewDidLoad() {
super.viewDidLoad()
textField.text = dataPassed
// Handle the user input in the text field through delegate callbacks
textField.delegate = self
}
// UITextFieldDelegate
func textFieldShouldReturn(textField: UITextField) -> Bool {
// User finished typing (hit return): hide the keyboard.
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(textField: UITextField) {
dataPassed = textField.text
}
}
esecuzione Esempio:
È sufficiente implementare 'prepareForSegue' nel controller di visualizzazione unwinding e accedere a' destinationViewController', che sarà il controller di visualizzazione a cui ci si sta svolgendo. Probabilmente vorrai dare lo svolgimento e l'identificatore allo svolgimento nello storyboard – Paulw11
Viene visualizzato un messaggio di errore "non ha seguito con identificatore" btnSubmitSegue "". Ho aggiunto l'identificatore dei passaggi nel controller della vista. Sto usando solo un seguito per collegare entrambi i controller della vista. Credo che il riavvolgimento segua solo il precedente controller di visualizzazione senza ulteriori passaggi? Puoi spiegare in dettaglio?Un po 'di codice sarebbe apprezzato :) – ebby94
Si crea il percorso di svolgimento come di consueto - trascinare sull'icona' uscita 'nella scena. Ora nella finestra di ispezione dell'oggetto a sinistra vedrai le fasi di svolgimento elencate sotto il controller di visualizzazione, il primo risponditore e le icone di uscita. Puoi cliccare sul seguente svolgimento e assegnargli un identificatore nell'ispettore a destra. – Paulw11