2010-09-04 88 views
4

如何處理iPhone中需要使用較新方法但不適用於較舊版本的不推薦方法?在iPhone中處理不推薦使用的方法

請考慮在iOS 3.2中棄用的setStatusBarHidden:animated:的情況。該文檔指出您要使用setStatusBarHidden:withAnimation:,它僅在iOS 3.2或更高版本中可用。

如果我理解正確,這意味着要定位所有設備(iOS 3.0或更高版本),我必須先詢問setStatusBarHidden:withAnimation:是否可用。如果是,請使用它。如果不是,請使用棄用的方法。但我仍然會收到反對的警告。

這是正確的(請說不是!)?如果是這樣,是否有辦法抑制這個棄用警告,或者說明編譯器我已經處理了這個問題?

回答

6

我發現了一個similar疑問,假設,這是處理過時的方法的正確途徑,沒有,沒有辦法根據每個案例抑制棄用警告,但是有一些詭計會誤導編譯器。

爲了應付例子的情況下,我決定創建使用這些黑客之一的UTIL類:如果我沒有記錯使用respondsToSelector是昂貴

@protocol UIApplicationDeprecated 

- (void) setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated; 

@end 

@implementation UIUtils 

+ (void) setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated { 
    if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden:withAnimation:)]) { 
     [[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:animated ? UIStatusBarAnimationSlide : UIStatusBarAnimationNone]; 
    } else { 
     id<UIApplicationDeprecated> app = (id)[UIApplication sharedApplication]; 
     [app setStatusBarHidden:hidden animated:animated]; 
    } 
} 

@end 

。如果新的選擇器在第一個查詢之後出現,這可以針對性能進行優化,從而避免在隨後的調用中需要反射。

從Java背景來看,我發現這種處理貶值可怕的方式,我仍然不敢相信這就是iOS設計者期望我們處理這個問題的方式。更多關於這個問題的想法將不勝感激。

1

有可能是一個更好的答案,但我做的事曾經是:

1檢查deprecatedMethod可用。 (使用respondsToSelector:法)

2,如果是,那麼使用的Objective-C運行時函數調用該方法:

id objc_msgSend(id theReceiver, SEL theSelector, ...) 

使用此功能時,編譯器不會給你任何警告:)

3其他明智使用新方法

0

調用方法是這樣的:

id objc_msgSend(id theReceiver, SEL theSelector, ...)

會的情況下,要忽略警告UIApplication的可能不setStatusBarHidden:withAnimation:方法應對(在iOS 3.0或更高版本)更好的最佳的選擇。

相關問題