更改方法内的标签文本

我使用委托从视图控制器传回信息。 这是方法

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方法