我有一个带有文本字段的屏幕。
当用户在文本字段中输入文本,并从文本字段中点击时,就会发生segue。
下一屏幕的标签文本应该改为用户在上一屏幕中输入的文本。
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var inputField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
inputField.delegate = self
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
view.addGestureRecognizer(tap)
}
func dismissKeyboard() {
inputField.resignFirstResponder()
}
func textFieldDidEndEditing(inputField: UITextField) {
let info = inputField.text
print(info)
performSegueWithIdentifier("goToBlue", sender: info)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "goToBlue" {
if let blueVC = segue.destinationViewController as? BlueViewController {
if let sentValue = sender as? String {
blueVC.receptacle = sentValue
}
}
}
}
}
print(info)
语句不打印任何内容
然而,segue工作了,但是标签什么也没显示。
class BlueViewController: UIViewController {
@IBOutlet weak var blueText: UILabel!
var receptacle = ""
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
blueText.text = receptacle
}
}
显然这与时机有关…什么好主意吗?
您的viewWillAppear函数首先工作,并且您的容器变量未设置或您的标签未初始化。试试这个,
@IBOutlet weak var blueText: UILabel! { didSet { blueText.text = receptacle } }
var receptacle: String? { didSet { blueText.text = receptacle } }
变化
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
blueText.text = receptacle
}
override func viewDidLoad() {
super.viewDidLoad()
blueText.text = receptacle
}
不要使用sender
传递您的值。sender
仅用于检查哪个元素启动了segue,而不用于传递数据。只需将info
设置为类变量,并像这样传递值:
var info:String!
func textFieldDidEndEditing(inputField: UITextField) {
info = inputField.text
print(info)
performSegueWithIdentifier("goToBlue", sender: info)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "goToBlue" {
if let blueVC = segue.destinationViewController as? BlueViewController {
blueVC.receptacle = info
}
}
}
这是一种非常常见的方法(供参考,如果带有inputttextfield的vc是一个弹出窗口,你可以在呈现vc上调用contentviewcontroller)
func textFieldDidEndEditing(inputField: UITextField) {
textField.resignFirstResponder()
let info = inputField.text
print(info)
performSegueWithIdentifier("goToBlue", sender: info)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "goToBlue" {
if let blueVC = segue.destinationViewController as? BlueViewController {
blueVC.receptacle = self.inputField.text
}
}
}