更改方法内的标签文本
我使用委托从视图控制器传回信息。 这是方法
func writeValueBack(value: String) { self.label.text = value }
除了标签没有更新之外,所有的function都被调用。
该标签有一个值,不返回零,我检查了这一行
println(self.label.text)
它打印“值”的值
这意味着标签的文本被设置为“值”,但不会更新。
我甚至尝试使用主线程,但没有运气
func writeValueBack(value: String) { dispatch_async(dispatch_get_main_queue(), { () -> Void in self.label.text = value }) }
我只是不知道问题是什么
任何帮助将是伟大的。
协议:
protocol writeValueBackDelegate { func writeValueBack(value: String) }
编辑:我的视图控制器的代码:
// // ViewController.swift // DelegateTesting // // Created by Alex Catchpole on 30/11/2014. // Copyright (c) 2014 Alex Catchpole. All rights reserved. // import UIKit class ViewController: UIViewController, writeValueBackDelegate { @IBOutlet weak var label: UILabel! @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "MainSegue" { var vc = segue.destinationViewController as SecondViewController vc.labelText = textField.text vc.delegate = self } } func writeValueBack(value: String) { dispatch_async(dispatch_get_main_queue(), { () -> Void in self.label.text = value }) } @IBAction func button(sender: AnyObject) { self.label.text = textField.text } @IBAction func segue(sender: AnyObject) { performSegueWithIdentifier("MainSegue", sender: self) }
}
第二个ViewController源码:
// // SecondViewController.swift // DelegateTesting // // Created by Alex Catchpole on 30/11/2014. // Copyright (c) 2014 Alex Catchpole. All rights reserved. // import UIKit class SecondViewController: UIViewController { @IBOutlet weak var label: UILabel! @IBOutlet weak var textField: UITextField! var labelText: String! var delegate: writeValueBackDelegate? = nil override func viewDidLoad() { super.viewDidLoad() label.text = labelText // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func button(sender: AnyObject) { label.text = textField.text } @IBAction func segueBack(sender: AnyObject) { var editedText = label.text performSegueWithIdentifier("SecondSegue", sender: self) if (delegate != nil) { delegate?.writeValueBack(editedText) println("working") } } }
问题出在你的第二个视图控制器中,正如rdelmar指出的那样,它会创build第一个视图控制器的新实例,而不是导航回原始实例。
要解决这个问题,你可以使用dismissViewControllerAnimated:completion
而不是执行你的第二个segue。 但是放松会导致更简单的代码,可以通过添加到您的第一个视图控制器来实现:
@IBAction func unwindFromSecond(unwindSegue: UIStoryboardSegue) { if let secondViewController = unwindSegue.sourceViewController as? SecondViewController { label.text = secondViewController.label.text // Or whatever you need to retrieve data from the second controller } }
然后在你的故事板中,从第二个视图控制器创build一个展开的延续。 例如,如果您有一个“closures”button,请从此button控制拖动到第二个视图控制器场景中的“退出”图标,然后selectunwindFromSecond
。 有关详细的步骤,请参阅其他问题的答案: 什么是放松,以及如何使用它们?
您现在可以删除writeValueBackDelegate
声明和相关variables, writeValueBack
方法和第二个视图控制器的segueBack
方法