Ios 从segue返回后,ViewController中更改的值将重置
我的应用程序有两个ViewController,我可以通过分段前后切换。第一个(主)VC有许多已初始化的变量。第二个VC是键盘编辑器,可以更改第一个VC中的一个变量;第一个VC发送一个指示器,指示要更改的变量,第二个VC发送回新值 但是,如果我更改一个值,然后更改第二个值,则更改的第一个值将重置为其初始值 这是第一个ViewController(至少是示例所需的部分): 这是第二个ViewController:Ios 从segue返回后,ViewController中更改的值将重置,ios,swift,segue,Ios,Swift,Segue,我的应用程序有两个ViewController,我可以通过分段前后切换。第一个(主)VC有许多已初始化的变量。第二个VC是键盘编辑器,可以更改第一个VC中的一个变量;第一个VC发送一个指示器,指示要更改的变量,第二个VC发送回新值 但是,如果我更改一个值,然后更改第二个值,则更改的第一个值将重置为其初始值 这是第一个ViewController(至少是示例所需的部分): 这是第二个ViewController: class KeypadViewController: UIViewControll
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
除了将第一个控制器中的所有可变值传递给第二个控制器,然后让第二个控制器将它们全部发送回(在任何更改后)第一个控制器之外,还有什么方法可以让第二个控制器更改一个值而不重设其他值呢?当您触发一个序列时,它会初始化一个新的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)
}
}
rdelmar在对我最初问题的评论中回答。(这是因为我找不到方法将对原始问题的评论标记为答案而添加的。)您是否使用“放松”序列返回到第一个控制器?如果没有,那么你实际上就不会回去,你正在实例化一个新的控制器。“Un-wind-seg-ue?”你的想法引起了我的兴趣,我想订阅你的时事通讯。(说真的,这就解决了——谢谢。)
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)
}
}