iPhone dev - 缓存标签栏视图控制器的值

时间:2009-08-17 18:54:47

标签: iphone caching uiviewcontroller uitabbar

我有一个根UIViewController子类,它有一个UITabBar,(我没有使用UITabBarController)和5个视图控制器的5个标签栏项。每个视图控制器都有一个UIPickerView。一次只实例化一个视图控制器 - 当选择标签栏项目时,删除当前标签栏项目,实例化并添加新项目,并释放旧项目(self.oldvc = nil;)。因此,如果用户在第一个选项卡中转到选择器的第3行,然后切换到第二个选项卡,然后返回,我希望再次选择选择器的第3行。目前,我有它所以视图控制器实例化与initWithSelectedRowOfFirstComponent:(NSInteger)firstRow secondComponent:(NSInteger)..等,然后在我的根视图控制器,(与标签栏的oner),我有一个ivar缓存每个值..但我不确定..有没有更好的方法来做到这一点?也许是一个plist文件或字典或者什么......我不知道,你认为最好的方法是什么?谢谢!

我决定使用UITabBarController,让内存警告解除分配,并使用一个名为“Model”的类,它是一个单例(使用this macro)来保存由于内存警告而导致视图卸载时使用的数据。

2 个答案:

答案 0 :(得分:1)

如果您不想保留所有五个视图控制器(在数组中),您可以将视图的状态分成新类。然后,您将保留该类的5个实例,并编写一个可以从新类的实例初始化UIPickerViews的函数。

每当用户选择其他选项卡时,都会将对相应状态对象的引用传递给设置视图的函数。此外,通过视图对状态所做的所有更改都应直接应用于模型对象。您的根UIViewController充当主控制器。另见:MVC Pattern

基于您的评论的其他想法...

我认为您可以尝试以下操作:不要在按下选项卡按钮时创建和销毁UIPickerView对象,而是抓住对象。在主控制器中有一个“NSMutableArray * viewArray”,它包含所有视图。我假设您的根UIViewController是UITabBar的委托。当您收到 tabBar:didSelectItem:消息时,您将隐藏当前视图并显示与所选项对应的视图。只需迭代整个数组,根据项目是否与所选标签栏项目相对应隐藏/取消隐藏项目。

基本上这有点像开始实现你自己的UITabBarController版本,所以也许你应该考虑使用它。

答案 1 :(得分:0)

也许你可以在你的viewController中保留一组你的选择器,只需创建一次,在解除分配之前,你更新对选择器的引用,并在重新实例化时从数组中设置选择器而不是创建一个新选择器。