从segue返回后,ViewController中的更改值将重置

时间:2014-12-14 00:01:12

标签: ios swift segue

我的应用程序有两个ViewControllers,我可以通过seg来回切换。第一个(主)VC有许多初始化的变量。第二个VC是键盘编辑器,它可以改变第一个VC中的一个变量;第一个VC发送一个指示,指示要更改的变量,第二个VC发回新值。

但是,如果我更改某个值,然后更改第二个值,则更改的第一个值将重置为其初始值。

这是第一个ViewController(至少是示例所需的部分):

class ViewController: UIViewController {

    var idToChange: Int;
    var ValueOne: Int;
    var ValueTwo: Int;

    required init(coder aDecoder: NSCoder) {
        idToChange = 0;
        ValueOne = 1;
        ValueTwo = 2;
        super.init(coder: aDecoder);
    }

    @IBAction func clickChangeValue1(B: UIButton)
    {
        idToChange = 1;
        performSegueWithIdentifier("segueKeypadView", sender: self);
    }

    @IBAction func clickChangeValue2(B: UIButton)
    {
        idToChange = 2;
        performSegueWithIdentifier("segueKeypadView", sender: self);
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var vc: KeypadViewController = segue.destinationViewController as KeypadViewController;
        vc.idToChange = idToChange;
    }
}

这是第二个ViewController:

class KeypadViewController: UIViewController {

    var idToChange: Int;
    var changedValue: Int;

    required init(coder aDecoder: NSCoder) {
        idToChange = 0;
        changedValue = 0;
        super.init(coder: aDecoder);
    }
    // Note that idToChange is set correctly by the segue

    // Code that sets changedValue left out

    @IBAction func clickTheOKButton(B: UIButton)
    {
        performSegueWithIdentifier("segueMainView", sender: self);
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var vc: ViewController = segue.destinationViewController as ViewController;
        switch (idToChange)
        {
            case 1:
                vc.ValueOne = changedValue;
            case 2:
                vc.ValueTwo = changedValue;
            default:
                break;
        }
    }
}

当主控制器请求更改Value1,并且第二个控制器尝试将Value1更改为10时,则Value1为10。 但是,如果主控制器然后请求更改Value2,并且第二个控制器尝试将Value2更改为20,则Value2将变为20,但Value1将设置回其初始化值1。

没有将第一个控制器中的所有可变值传递给第二个控制器,然后让第二个控制器将它们全部发送回(在任何更改之后)到第一个控制器,是否有任何方法可以让第二个控制器发生变化没有重置其他值的一个值?

2 个答案:

答案 0 :(得分:2)

当你触发Segue时,它会初始化一个新的ViewController。您应该使用“后退按钮”或popViewController

像这样:

class KeypadViewController: UIViewController {

  var idToChange: Int;
    var changedValue: Int;

    required init(coder aDecoder: NSCoder) {
        idToChange = 0;
        changedValue = 0;
        super.init(coder: aDecoder);
    }
    // Note that idToChange is set correctly by the segue

    // Code that sets changedValue left out

    @IBAction func clickTheOKButton(B: UIButton) {
        var vc: ViewController = self.navigationController.viewControllers[0] as ViewController // Your view controller's index.
        switch (idToChange) {
            case 1:
                vc.ValueOne = changedValue;
                break;
            case 2:
                vc.ValueTwo = changedValue;
                break;
            default:
                break;
        }

        self.navigationController.popViewControllerAnimated(true)
    }

}

答案 1 :(得分:0)

rdelmar回答我对原始问题的评论。 (这是因为我无法找到将原始问题的评论标记为答案的方法。)