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

Posted

技术标签:

【中文标题】iPhone dev - 标签栏视图控制器的缓存值【英文标题】:iPhone dev - cache values of tab bar view controllers 【发布时间】:2009-08-17 18:54:47 【问题描述】:

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

我决定使用 UITabBarController,让内存警告解除分配并使用我称为“模型”的类,它是一个单例(使用 this macro)来保存要在视图因内存警告而被卸载时使用的数据。

【问题讨论】:

【参考方案1】:

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

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

基于您的 cmets 的其他想法...

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

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

【讨论】:

视图控制器不在一个数组中,但无论如何,你能解释一下我该怎么做吗?这听起来是个好主意,但我不确定该怎么做。 所以我应该创建一个新类,只是一个普通的 NSObject 子类,它包含控制器的状态,并在我的根控制器中有一个实例? .. 但是 uipicker 的组件数量并不相同,其中一个是日期选择器,那么如何将一个类用于所有组件? 但是制作我自己的 UIViewController 的全部目的是通过一次只分配一个来提高内存效率.. 你确定你没有过早优化吗?您可能会为了不需要的优化而牺牲简单性。【参考方案2】:

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

【讨论】:

以上是关于iPhone dev - 标签栏视图控制器的缓存值的主要内容,如果未能解决你的问题,请参考以下文章

没有标签栏项目的视图的标签栏 iPhone 应用程序

如何在iphone中设置默认选中Tab bar item 1?

如何获取标签栏控制器中包含的所有视图控制器? iphone开发

如何在iphone中将值从一个标签栏传递到另一个标签栏

iPhone在标签栏应用程序模板上的TabBarController之前创建视图

iPhone:标签栏下的 UITableView 滚动