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

Posted

技术标签:

【中文标题】切换视图控制器时如何保留 UIDatePicker 和 UITextField 值?【英文标题】:How to Retain UIDatePicker and UITextField Values When Switching View Controllers? 【发布时间】:2013-01-13 23:04:34 【问题描述】:

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

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

它是这样初始化的:

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

我正在使用 Push Segue 到达第二个视图控制器并返回:

[self.navigationController popViewControllerAnimated:YES];

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

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

谢谢。

【问题讨论】:

你需要展示一些关于你如何初始化你的视图控制器的代码。您是否将 View Controller 2 保存为 View Controller 1 中的 ivar? 在 ViewController.m 我有:@synthesize datepick;已尝试保存值并将它们放回 DatePicker 和 UITextField 但它们不粘。 【参考方案1】:

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

一种解决方案是确保您从视图控制器 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)。

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

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

【讨论】:

我了解您所展示的概念,但不了解它的实现。我正在使用 Xcode 4.5 并在 MainStoryboard 中有两个 View Controller 对象。我有一个 ViewController.h 文件和一个 ViewController.m 文件。使用此设置,我无法实现您上面描述的内容。 在第一个视图控制器中,我还有一个带有 7 个段的 segmentedControl。无论我切换 View Controller 窗口多少次,segmentedControl 都会完全记住哪个段被占用。那么,它是如何记住它的值而不是 UIDatePicker 的呢? 啊——实验表明,当切换回第一个控制器时,它会保留第一个控制器中任何对象中的数据。它是当前丢失数据的第二个控制器。所以,回到你的解决方案,我无法开始工作。

以上是关于切换视图控制器时如何保留 UIDatePicker 和 UITextField 值?的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器之间切换时保留按钮状态

在 UITabBarController 中,如何从一个视图控制器切换到另一个视图控制器并保留标签栏?

从一个 VC 切换到另一个 VC 时在视图控制器中保留数据

UIPopover 中的 UIDatePicker

启动时如何将数据从 uiviewcontroller 发送到 uipopover?

无法找到呈现视图控制器 - 覆盖中的 UIDatePicker