2013-01-13 34 views
1

我有两个视图控制器。 视图控制器#2有一个UIDatePickerUITextField如何在切换视图控制器时保留UIDatePicker和UITextField值?

如果我回到视图控制器#1,然后回到视图控制器#2,UIDatePicker已经失去了它的上一个选定日期,并且UITextField是空的。

有人这样初始化:

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

我使用推送Segue公司,并取回使用获得的第二个视图控制器:

[self.navigationController popViewControllerAnimated:YES]; 

我怎样才能“拯救”中的UIDatePicker日期和UITextField值,以便它在返回到该视图控制器时总是在那里?

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

谢谢。

+0

您需要展示一些关于如何启动视图控制器的代码。并且您是否将视图控制器2保存为视图控制器1中的ivar? –

+0

在ViewController.m中我有:@synthesize datepick; 已经尝试保存值并将它们放回到DatePicker和UITextField中,但它们不会粘住。 – mstace

回答

0

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

一个解决办法是,以确保你有很强的参考视图控制器2,从视图控制器1.在第一视图控制器添加一个属性:

@property (nonatomic, retain) SecondViewController *mySecondViewController; 

实施,吸气:

- (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)

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

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

+0

我了解您正在展示的概念,但不了解它的实施情况。我正在使用Xcode 4.5,并在MainStoryboard中有两个View Controller对象。我有一个ViewController.h文件和一个ViewController.m文件。使用这个设置我还没有能够实现你上面描述的。 – mstace

+0

在第一个视图控制器中,我也有一个7段的分段控件。无论切换View Controller窗口的次数如何,segmentedControl都可以完全记住哪个段被占用。那么,它如何记住它的值而不是UIDatePicker? – mstace

+0

啊 - 试验表明,在切换回第一个控制器中的ANY对象时,数据会保留。它是目前正在丢失数据的第二个控制器。所以,回到我无法工作的解决方案。 – mstace

相关问题