委托方法Swift无法正常工作

时间:2015-07-21 17:34:09

标签: ios swift delegates

我试图让我的视图控制器相互通信并传递可以相互更改的值。在这种特殊情况下,我试图将值从第一个控制器传递到第二个控制器,更改第二个控制器中的值,然后将值从第二个控制器传递回第一个控制器。我可以执行第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。

1 个答案:

答案 0 :(得分:0)

一般情况下,您可能不想考虑让ViewControllers直接相互通话。

你想要的是一个长寿的第三个实体,两个ViewControllers都可以与之交谈。我们现在就调用这个TextManager。

因此,OpenViewController调用TextManager来设置其他UIViewControllers可能需要的文本。然后你的第二个UIViewController也可以与TextManager交谈以检索文本。同样,它可以向TextManager发送第一个viewController可以读取的更改。

UIViewControllers不会活很久 - 他们来来去去。因此,您需要第三件事来处理长期存在的数据。