iOS 3 - UITabBarItems在发生内存警告后从UITabBar中消失

时间:2011-05-24 02:38:08

标签: cocoa-touch ios uikit uitabbar uitabbaritem

在使用较旧的iOS硬件的人的大量请求中,我正在重构和优化我的应用程序,因此它可以在iOS 3上运行。那就是说我的UITabBar有一个小问题我可以复制我测试过的所有iPhone 3G设备。

这个故障似乎已经在iOS 4中修复了,但是我想知道在那之前是否有其他人也有这个故障,并且已经找到了一个(相对优雅的)解决方法。

问题是你可以在下面看到的;当发生内存警告并且屏幕上的所有视图都被释放时,当我带一个带有标签栏的视图控制器回到屏幕上时,应该在其中的所有UITabBarItem都消失了。据我所知,他们根本没有被吸引;即点击标签栏无效。在设置了断点并检查内存中的UITabBar及其项目后,它们仍然存在(即没有被释放),只是在控制器loadView方法中重新创建UITabBar时它们没有重新绘制。

我的应用程序与官方Twitter应用程序类似,因为我实现了自己的UITabBarController版本,因此我可以正确控制它与父UINavigationController的集成。我尽可能地将其设置为原始的UITabBarController类,所有子视图控制器都处理它们各自的UITabBarItem并在类的init方法中初始化它们。通过访问器方法将子视图控制器传递给我的TabController对象后,将访问tabBarItems并将其添加到UITabBar视图中。

之前是否有人见过这种行为并知道我可以解决的问题?我希望有一个非常简单的解决方案,因为它已经在iOS 4中运行,所以我不想太糟糕了。

非常感谢!

Home Screen after memory warning has occurred

1 个答案:

答案 0 :(得分:0)

经过一番研究,我认为我找到了解决方案。这不是我追求的最优雅的解决方案,但绝对有效。

我猜测在触发内存警告后,UITabBarItem对象发生了某些事情,基本上会导致它们损坏。我尝试了很多东西(冲掉UITabBar,重新创建控制器阵列等),但没有任何效果。

我终于发现,如果你完全销毁了UITabBarItem并在它们的位置分配了新的,那么那些就可以了。 :)

所以我对此的最终解决方案是在我的控制器的viewDidLoad方法中添加一个额外的条件,如果检测到的系统是iOS 3,并且已经有一个UITabBarItems数组,它将遍历每个,复制出所有需要的属性,销毁它,分配一个新属性,然后将旧属性复制到新属性。

我仍然会留意一个更好的解决方案(我认为这个方法有一些开销),但幸运的是,在这个阶段,iOS 3传统支持变得越来越不成问题。 :)