我有两个视图控制器。
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时始终存在?
我搜索并发现了意见,假设和建议,但没有解决方案。
谢谢。
答案 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)。
这种方法相对容易实现,但必须降低,第二个视图控制器保留在内存中,即使不再需要它。
另一种方法是将所选日期或文本传回第一个视图控制器(可能通过自定义委托协议),并在下次要呈现第二个视图控制器时,将这些值传递给它以设置日期和文字。