0

在使用旧 iOS 硬件的人的大量请求下,我目前正在重构和优化我的应用程序,以便它可以在 iOS 3 上运行。话虽如此,我的 UITabBar 有一个小故障,我可以在所有的iPhone 3G 设备我已经对其进行了测试。

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

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

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

有没有人见过这种行为并知道我可以解决它的方法?我希望有一个非常简单的解决方法,因为它已经在 iOS 4 中运行,所以我不想把它弄得太糟糕。

非常感谢!

发生内存警告后的主屏幕

4

1 回答 1

0

经过一番研究,我想我找到了解决方案。这不是我所追求的最优雅的解决方案,但它确实有效。

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

我终于发现,如果您完全销毁 UITabBarItems 并在它们的位置分配新的,那么这些将起作用。:)

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

我仍然会留意一个更好的解决方案(我认为这种方法有一点开销),但幸运的是在这个阶段,iOS 3 旧版支持正变得越来越少。:)

于 2011-06-09T01:33:34.020 回答