Ответ 1
Øyvind Hauge избил меня к тому же методу решения, но, как я уже начал с более подробного ответа, я также добавлю его.
Предположим, что ваши два контроллера представления названы следующим образом:
- Мастер/точка входа:
ViewController
(vcA)
- Вторичный вид:
ViewControllerB
(vcB)
Вы установили segue из (vcA) -> (vcB)
, как вы это сделали в примере
/* 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
}
}
Несколько сложный шаг следующий заключается в том, что с помощью этого метода сегмент, используемый для передачи данных от (vcB)
до (vcA)
, также добавляется к источнику (vcA)
в качестве метода @IBAction
(а не, как и следовало ожидать, добавляется к источнику (vcB)
).
/* in ViewController.swift */
// ...
// segue ViewControllerB -> ViewController
@IBAction func unwindToThisView(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? ViewControllerB {
dataRecieved = sourceViewController.dataPassed
}
}
После этого подключите, скажем, кнопку (vcB)
к этому оператору разматывания в (vcA)
с помощью руководства Exit
segue в (vcB)
:
Ниже приведен полный пример прохождения текста от (vcA)
до (vcB)
; (возможно), изменяя этот текст через UITextField
, вернув (возможно) измененный текст в (vcA)
.
(vcA)
источник:
/* 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)
source (обратите внимание, что делегат UITextFieldDelegate
здесь используется только для "локально", изменяющего значение свойства dataPassed
, которое будет возвращено в (vcA)
и присвоено свойству dataRecieved
последняя)
/* 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
}
}
Пример выполнения: