2011-05-24 90 views
0

在使用舊iOS硬件的人們提出的大量請求中,我目前正在重構和優化我的應用程序,以便它可以在iOS 3上運行。這就是說,我的UITabBar出現了一個小故障,我可以在我測試過的所有iPhone 3G設備上進行復制。iOS 3 - 發生內存警告後,UITabBarItem從UITabBar中消失

該故障似乎已在iOS 4中得到修復,但我想知道是否在此之前,其他人也出現過這種故障,並想出了一個相對優雅的解決方法。

問題是你可以在下面看到;當發生內存警告並且所有的離屏視圖都被釋放時,當我將一個帶有標籤欄的視圖控制器帶回到屏幕上時,應該在其中的所有UITabBarItem都將消失。據我所知,他們根本沒有被吸引;即點擊標籤欄不起作用。在設置斷點並檢查UITabBar及其內存中的項目之後,它們仍然在那裏(即未釋放),只是在控制器loadView方法中重新創建UITabBar時,它們不會重新繪製。

我的應用程序與官方Twitter應用程序類似,因爲我實現了自己的UITabBarController版本,因此我可以正確控制它與父級UINavigationController的集成。儘管我儘可能地將其設置爲與最初的UITabBarController類相似,但所有子視圖控制器都處理各自的UITabBarItems並在類的init方法中初始化它們。一旦子視圖控制器通過訪問器方法傳遞給我的TabController對象,就可以訪問tabBarItems並將其添加到UITabBar視圖。

有沒有人見過這種行爲之前,知道我可以修復它的方式?我希望有一個非常簡單的修復方法,因爲它已經可以在iOS 4中運行了,所以我不想把它弄得太糟糕。

非常感謝!

Home Screen after memory warning has occurred

回答

0

了一些研究之後,我想我找到了解決這個。這不是我以前最優雅的解決方案,但它絕對有效。

我猜是在內存警告被觸發後,UITabBarItem對象發生了一些基本上會導致它們損壞的事情。我嘗試了很多東西(刷新UITabBar,重新創建控制器數組等),但沒有任何工作。

我終於發現,如果你完全銷燬UITabBarItems並在他們的位置分配新的,那麼這些將工作。 :)

所以我的最終解決方案是在我的控制器的viewDidLoad方法中添加一個額外的條件,如果檢測到的系統是iOS 3,並且已經有一個UITabBarItems數組,它會遍歷每一個,複製出所有需要的屬性,銷燬它,分配一個新的屬性,然後將舊的屬性複製到新的屬性中。

我仍然要留意一個更好的解決方案(我認爲有這個方法有點開銷),但值得慶幸的是,在這個階段,iOS的3傳統支持,成爲一個問題的越來越少。 :)

+0

聽起來不錯!當然,我對你的應用更感興趣,現在我看到了截圖。 :)鏈接可用? – 2011-10-11 22:09:19

+0

哈哈謝謝!啊,有一個鏈接。但不幸的是,我被要求下載應用程序。^_ ^; (http://www.tim-oliver.com/2011/07/21/on-ipokedex-getting-pulled/) 爲了記錄,這是我最後一次使我的應用程序與iOS 3兼容。這是奇怪的怪癖,使它成爲一個瘋狂的噩夢... – TiM 2012-02-04 06:24:26

+0

iOS 3?是的,拜拜。讓我們聽聽Xcode 4.2,ARC和Storyboards - mwahaaa。 :) – 2012-02-20 21:50:08