如何在切换视图控制器时保留UIDatePicker和UITextField值?

时间:2013-01-13 23:04:35

标签: objective-c retained-in-memory

我有两个视图控制器。 View Controller#2有一个UIDatePicker和一个UITextField

如果我返回View Controller#1然后返回View Controller#2,则UIDatePicker已丢失其先前选择的日期,并且UITextField为空。

它以这种方式初始化:

@property (retain, nonatomic) IBOutlet UIDatePicker *datepick;

我使用Push Segue进入第二个View Controller并使用:

[self.navigationController popViewControllerAnimated:YES];

如何“保存”UIDatePicker日期和UITextField值,以便在返回到该View Controller时始终存在?

我搜索并发现了意见,假设和建议,但没有解决方案。

谢谢。

1 个答案:

答案 0 :(得分:0)

发生这种情况,因为(如果您正确管理内存)第二个视图控制器在弹出时会被释放(返回第一个视图控制器)。因此,当您想要返回它时,实际上是使用默认值创建一个全新的实例。

一种解决方案是确保从视图控制器1中查看控制器2的强引用。在第一个视图控制器中添加属性:

@property (nonatomic, retain) SecondViewController *mySecondViewController;

实施getter:

- (SecondViewController *)mySecondViewController {
    if (!mySecondViewController) {
        mySecondVieWController = [[SecondViewController alloc] init...];
    }
    return mySecondViewController;
}

然后当你想要呈现它时:

[self.navigationController pushViewController:self.mySecondViewController animated:YES];

第一次调用它时,mySecondViewController仍为nil,因此getter会对其进行初始化。下次调用getter时,它只返回相同的实例。

不要忘记在dealloc中释放视图控制器。顺便说一下,考虑使用Automatic Reference Counting (ARC)

这种方法相对容易实现,但必须降低,第二个视图控制器保留在内存中,即使不再需要它。

另一种方法是将所选日期或文本传回第一个视图控制器(可能通过自定义委托协议),并在下次要呈现第二个视图控制器时,将这些值传递给它以设置日期和文字。