将用户输入的文本传递给下面的segue



我有一个带有文本字段的屏幕。

当用户在文本字段中输入文本,并从文本字段中点击时,就会发生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
            }
        }
    }

最新更新