我试图让我的视图控制器相互通信并传递可以相互更改的值。在这种特殊情况下,我试图将值从第一个控制器传递到第二个控制器,更改第二个控制器中的值,然后将值从第二个控制器传递回第一个控制器。我可以执行第1步和第2步,但是第3步不起作用,当我尝试获取更改后的值时,当它到达viewDidLoad()时它不会被更改。以下是示例代码:
//first controller
class OpenViewController: UIViewController, UpdateDelegate {
var text: String!
func save(controller: ViewController, text2: String) {
text = text2//set the new value of text to text2
controller.navigationController?.popViewControllerAnimated(true)
println(text)
}
override func viewDidLoad() {
super.viewDidLoad()
if(text.isEmpty) { //if text is empty set value to hi
text = "hi"
}
else{
print(text)
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToList" {
var vc = segue.destinationViewController as! ViewController
vc.text2 = text
vc.delegate = self
}
}
}
}
//second controller
protocol UpdateDelegate{
func save(controller: ViewController, text2: String)
}
class ViewController: UIViewController {
var delegate: UpdateDelegate? = nil
var text2: String!
@IBAction func home(sender: AnyObject) { //button click to go back to first view controller
delegate!.save(self, text2: String) //save the updated value into first view controller
}
override func viewDidLoad() {
super.viewDidLoad()
self.text2 = text! //set value of text2 to the value of text from previous view controller
self.text2 = "bye"//change text2 value to "bye"
}
}
打印语句用于检查它是否按预期工作。保存功能中的println(文本)实际上显示文本的text2值已更改,但是当它在OpenViewController中向下查看viewDidLoad()时,文本现在再次为空。我对委托的印象是OpenViewController中的文本值是来自ViewController的text2。
答案 0 :(得分:0)
一般情况下,您可能不想考虑让ViewControllers直接相互通话。
你想要的是一个长寿的第三个实体,两个ViewControllers都可以与之交谈。我们现在就调用这个TextManager。
因此,OpenViewController调用TextManager来设置其他UIViewControllers可能需要的文本。然后你的第二个UIViewController也可以与TextManager交谈以检索文本。同样,它可以向TextManager发送第一个viewController可以读取的更改。
UIViewControllers不会活很久 - 他们来来去去。因此,您需要第三件事来处理长期存在的数据。