Øyvind Hauge pokazał mi do tego samego rozwiązania metody, ale jak już się rozpoczął z bardziej szczegółową odpowiedź, będę go dodać również.
Powiedzmy twoje dwie widok kontrolerów nazywane są następująco:
- punkt Master/entry:
ViewController
(vcA)
- widok wtórne:
ViewControllerB
(vcB)
można skonfigurować segue z (vcA) -> (vcB)
jak to zrobiliście w przykładzie
/* 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
}
}
Nieco trudne, następny krok polega na tym, przy użyciu tego sposobu, segue stosowany do przekazywania danych z powrotem z(vcB)
do(vcA)
jest również dodana do źródła (vcA)
jako metody @IBAction
(a niż, jak można się było spodziewać, dodać do źródła (vcB)
).
/* in ViewController.swift */
// ...
// segue ViewControllerB -> ViewController
@IBAction func unwindToThisView(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? ViewControllerB {
dataRecieved = sourceViewController.dataPassed
}
}
można następnie połączyć powiedzmy, przycisk w (vcB)
do tej rozwijania działań w (vcA)
poprzez ręczną Exit
segue w (vcB)
:

Poniżej następuje kompletny przykład przechodząc tekst z (vcA)
do (vcB)
; (prawdopodobnie) modyfikując ten tekst za pomocą UITextField
, ostatecznie zwracając (ewentualnie) zmodyfikowany tekst do (vcA)
.
(vcA)
źródło:
/* 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)
źródło (zauważ, że UITextFieldDelegate
delegat tutaj służy tylko do „lokalnie” mutowania wartość właściwości dataPassed
, która zostanie zwrócona do (vcA)
i przypisany do dataRecieved
własność tego ostatniego)
/* 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
}
}
Przykładowe wykonanie:

Po prostu zaimplementuj 'prepareForSegue' w rozwijanym kontrolerze widoku i uzyskaj dostęp do' destinationViewController', który będzie kontrolerem widoku, do którego się rozwijasz. Najprawdopodobniej będziesz chciał podać relację rozwijania i identyfikator w swoim scenorysie – Paulw11
Daje błąd "nie ma segue z identyfikatorem" btnSubmitSegue "" ". Dodałem identyfikator segue w kontrolerze widoku. Używam tylko jednej ścieżki do połączenia obu kontrolerów widoku. Wydaje mi się, że rozwijanie segue po prostu powraca do poprzedniego kontrolera widoku bez żadnych dodatkowych fragmentów? Czy możesz wyjaśnić szczegółowo?Jakiś kod byłby doceniony :) – ebby94
Tworzysz relind unwind jak zwykle - przeciągnij do ikony 'exit' w scenie. Teraz w inspektorze obiektów po lewej stronie zobaczysz rozwijaną relę wymienioną poniżej kontrolera widoku, ikony pierwszej odpowiedzi i wyjścia. Możesz kliknąć na rozwijaną zmianę i nadać jej identyfikator w inspektorze po prawej stronie. – Paulw11