0

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

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

4

2 回答 2

1

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

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

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

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

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

于 2009-08-17T19:08:04.887 回答
0

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

于 2009-08-17T19:00:09.740 回答