1

我有两个视图控制器。视图控制器 #2 具有 aUIDatePicker和 a UITextField

如果我回到 View Controller #1 然后再回到 View Controller #2,UIDatePicker 已经丢失了之前选择的日期,并且 UITextField 是空白的。

它是这样初始化的:

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

我正在使用 Push Segue 进入第二个视图控制器并使用以下方法返回:

[self.navigationController popViewControllerAnimated:YES];

如何“保存” UIDatePicker 日期和 UITextField 值,以便在返回该视图控制器时始终存在?

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

谢谢你。

4

1 回答 1

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 中释放视图控制器。顺便说一下,考虑使用自动引用计数 (ARC)

这种方法实现起来相对容易,但它有一个缺点,即第二个视图控制器保存在内存中,即使不再需要它也是如此。

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

于 2013-01-13T23:17:06.297 回答