2011-10-14 33 views
5

我已經開始使用iOS 5了,我已經看到XCode 4.2只允許我選擇iOS 5作爲基礎SDK,但不選擇iOS 4。我應該怎麼做才能使我的應用程序適應iOS 5.0保持與iOS的兼容性4

到目前爲止,我已經覆蓋UINavigationBar中的drawRect:方法來自定義其外觀,但iOS 5不再調用該方法。現在我必須使用[UINavigationBar外觀]來做到這一點(我認爲這更好)。然而,外觀方法只適用於iOS 5,所以如果我使用它,我的應用程序會在iOS 4上執行時崩潰。我該怎麼做?我是否需要在每個使用iOS 5方法的地方使用宏檢查iOS版本?

謝謝

阿里爾

回答

16

您的第一個問題的答案是:您必須使用iOS5(或最新的iOS SDK)作爲您的基本SDK,但您在部署目標下設置了最低支持的iOS版本。在那裏你可以設置iOS4.0(或任何你想要的)。

處理第二個問題的正確方法是測試的能力,而不是版本。所以,像這樣的在說,你application:didFinishLaunchingWithOptions:方法工作:

// iOS5-only to customize the nav bar appearance 
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) { 
    UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"]; 
    [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault]; 
} 

您就會對iOS5的SDK來編譯這一點,所以使用appearance都將被罰款。但是,當這個編譯的代碼在5之前的iOS版本上運行時,它會沒事的。

如前所述,您可以保持您的drawRect:代碼原樣。

+0

'[[UINavigationBar class] respondsToSelector:@selector(appearance)]'可以寫成'[UINavigationBar respondsToSelector:@selector(appearance)]' – user102008

0

你可以把同一段代碼中都的drawRect:是iOS 4的用途和[UINavigationBar的外觀]返回的代理。兩種不同的代碼路徑。

0

你不能用宏執行此操作,因爲兩個代碼路徑都必須到位,並且正確的路由依賴於運行時檢查。

SOOOO ......用這樣的:

NSString *os_version = [[UIDevice currentDevice] systemVersion]; 

讓您當前運行在iOS版本,並在5 &新的做[UINavigationBar的外觀],你可以回退到drawRect在iOS 4上的東西。

+0

這是一個壞主意。技術上使用操作系統版本將適用於大多數情況,但這不是一個可靠的解決方案。可以說tintColor在iOS 5中添加了UIBarButtonItem,在iOS 6中棄用並在iOS 7中刪除。隨着iOS 5版本安裝的應用程序在假想的iOS 7中將停止正常工作。當然,您可以隨時間釋放更新,添加其他條件和複雜性,但爲什麼不只是使用 - [respondsToSelector:]而不是擔心過去或未來? –

3

自定義標頭的另一種方式就是這樣。

UIImage *image = [UIImage imageNamed:@"header.png"]; 

if([navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 
    //iOS 5 new UINavigationBar custom background 
    [navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault]; 
} 
else{ 
    UIImageView *imgView = [[[UIImageView alloc] initWithImage:image] autorelease]; 
    [imgView setUserInteractionEnabled:NO]; 
    [imgView setTag:TOOLBAR_TAG]; 
    [navigationBar insertSubview:imgView atIndex:0]; 
} 

使用respondsToSelector就可以知道,如果函數是在這裏。

0

還可以利用下載適用於iPhone和iPad的4.3模擬器。那麼當你意外地使用iOS 5的東西時,你可以更快崩潰4.3 - 湯姆

+0

他們用來支持安裝多個SDK,但我想現在已經過去了。 –

相關問題