Øyvind Hauge schlug mich auf die gleiche Lösung Methode, aber wie ich schon mit einer detaillierteren Antwort begonnen hatte, werde ich es auch hinzufügen.
Lassen Sie uns sagen, dass Ihre beiden View-Controller werden wie folgt benannt:
Punkt
- Master/Eintrag:
ViewController
(vcA)
- Secondary Ansicht:
ViewControllerB
(vcB)
Sie richten die segue von (vcA) -> (vcB)
wie Sie in Ihrem Beispiel
getan haben
/* 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
}
}
Der etwas heikel Schritt ist weiter, dass mit dieser Methode, die segue verwendet für Daten zurück von(vcB)
-(vcA)
ist auch zur Quelle des (vcA)
hinzugefügt, als @IBAction
Methode übergeben (eher als, wie möglicherweise zu erwarten war, zu der Quelle von (vcB)
hinzugefügt).
/* in ViewController.swift */
// ...
// segue ViewControllerB -> ViewController
@IBAction func unwindToThisView(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? ViewControllerB {
dataRecieved = sourceViewController.dataPassed
}
}
Sie danach eine Verbindung beispielsweise einen Knopf in (vcB)
dieser Abroller Aktion in (vcA)
über die manuelle Exit
segue in (vcB)
:
Im Folgenden ein vollständiges Beispiel folgt aus (vcA)
zum Text der Weitergabe (vcB)
; (möglicherweise) Ändern dieses Textes über eine UITextField
, schließlich den (möglicherweise) modifizierten Text an (vcA)
.
(vcA)
Quelle:
/* 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)
Quelle (beachten Sie, dass die UITextFieldDelegate
Delegierten hier nur für „lokal“ verwendet wird, um den Wert der dataPassed
Eigenschaft mutiert, die zu (vcA)
und zugewiesen zurückgegeben werden dataRecieved
Eigenschaft der letzteren)
/* 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
}
}
Beispielausführung:
Implementieren Sie einfach 'prepareForSegue' in Ihrem Abwicklungsansicht-Controller und greifen Sie auf den' destinationViewController' zu, bei dem es sich um den View-Controller handelt, auf den Sie zugreifen möchten. Wahrscheinlich möchten Sie den Abwicklungsbereich und die Kennung in Ihrem Storyboard angeben. – Paulw11
Es wird ein Fehler ausgegeben "hat keinen Übergang mit dem Bezeichner 'btnSubmitSegue' '". Ich habe die Segmentkennung im View-Controller hinzugefügt. Ich verwende nur einen Übergang, um beide View-Controller zu verbinden. Ich glaube, dass sich above segue einfach auf den vorherigen View-Controller zurückzieht, ohne dass zusätzliche Schritte erforderlich sind. Können Sie das bitte im Detail erklären?Irgendein Code würde geschätzt werden :) – ebby94
Sie erstellen die Abwicklungssequenz wie üblich - ziehen Sie auf das 'Exit'-Symbol in der Szene. Im Objektinspektor auf der linken Seite sehen Sie jetzt den Abwicklungsbereich, der unter den Symbolen für View-Controller, First Responder und Exit aufgelistet ist. Sie können auf den Abwicklungsabschnitt klicken und im Inspektor auf der rechten Seite eine Kennung eingeben. – Paulw11