this 질문에 대한 답변을 듣고 있지만 ViewControllerB
(두 번째 View Controller)의 데이터를 ViewController
(초기 View Controller)으로 전달하는 데 문제가 있습니다. 내가 추가 한 몇 개의 인쇄문의 결과를 바탕으로, 에 풀리는 것이 textFieldDidEndEditing
전에 일어나고 있다고 생각합니다. 긴급한 상태에서 텍스트 필드의 데이터 전달 문제
dataPassed from ViewControllerB: Default passed data
newValue: Default passed data
textFieldDidEndEditing: Pass this back
는 I 성공적 수 있었다
ViewControllerB
의 버튼에 출구를 만들고
dataPassed = textField.text
설정하여
ViewController
에 다시 데이터를 전달한다. 이 작업을 수행 할 수 있었던 또 다른 방법은
unwindToThisController
함수에서
dataReceived = sourceViewController.dataPassed
을
dataReceived = sourceViewController.textField.text
으로 변경하는 것입니다. 그러나 위에서 언급 한 허용 된 응답의 포스터가 이러한 해결 방법 중 하나를 사용하는 것처럼 보이지는 않으며 이러한 해결 방법 중 하나가이를 수행 할 수있는 적합한 방법인지 확실하지 않습니다. 내가 엑스 코드 8.2.1 및 스위프트를 사용하고
3.
의 ViewController 코드 (초기보기 컨트롤러)
/* ViewController.swift */
import UIKit
class ViewController: UIViewController {
var dataReceived: String? {
willSet {
print("newValue: " + newValue!)
labelOne.text = newValue
}
}
@IBOutlet weak var labelOne: UILabel!
@IBAction func buttonOne(_ sender: UIButton) {
performSegue(withIdentifier: "viewNext", sender: self)
}
override func viewDidLoad() {
super.viewDidLoad()
labelOne.text = "Default passed data"
}
// Segue ViewController -> ViewControllerB
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "viewNext" {
let viewControllerB = segue.destination as! ViewControllerB
viewControllerB.dataPassed = labelOne.text
}
}
// Segue ViewController <- ViewControllerB
@IBAction func unwindToThisControllerWithSegue(sender: UIStoryboardSegue) {
if let sourceViewController = sender.source as? ViewControllerB {
print("dataPassed from ViewControllerB: " + sourceViewController.dataPassed!)
dataReceived = sourceViewController.dataPassed
//dataReceived = sourceViewController.textField.text
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
ViewControllerB 코드 (두 번째보기 컨트롤러)
/* ViewControllerB.swift */
import UIKit
class ViewControllerB: UIViewController, UITextFieldDelegate {
var dataPassed: String?
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.text = dataPassed
textField.delegate = self
}
// Text field delegate methods
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
print("textFieldDidEndEditing: " + textField.text!)
dataPassed = textField.text
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
'print ("ViewControllerB에서 데이터 패스 :"+ sourceViewController.dataPassed! ")에 중단 점을 넣으면 어떻게됩니까? 당신은'sourceViewController'를 검사하고 어느 속성이 정의되고 있는지 확인할 수 있습니까? – brandonscript
당신이 옳다고 생각하는 것처럼,'textFieldDidEndEditing'가 호출되기 전에 View Controller를 닫는 IBAction 이벤트가 발생하고 있습니다. 사물의 순서를 바꾸고 첫 번째 응답자를 사퇴시키는 버튼을 처리하고,보기 컨트롤러를 닫는 다른 버튼이나 기능을 사용할 수 있습니다. – brandonscript
@mosley -'unwindToThisControllerWithSegue' 안에'dataPassed = sourceViewController.textField.text'라고 말 했나요? 'UITextField' 델리게이트가'textFieldDidEndEditing (_ :)'을 호출하기를 기다리는 대신 현재 textField에있는 텍스트를 취할 수 있습니다. 그냥 생각 했어요 – Pierce