切换视图控制器时如何保留 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 中,如何从一个视图控制器切换到另一个视图控制器并保留标签栏?