問題: すべての新しい iOS には、多くの新しい便利なクラスが追加されます。たとえば、UIRefreshControl です。iOS5 ビルドでこのクラスのサポートを追加したいと考えています。
クールな解決策ではありません: UIRefreshControl を使用する必要があるすべてのクラスで、現在の iOS バージョンを確認し、そのクラスのインライン置換を使用できます。次に例を示します。
pseudocode
...
- (void)viewDidLoad
{
...
if([[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
self.refreshControl = [[MyCustonRefreshControl_for_iOS5 alloc] init];
}
else
{
self.refreshControl = [[UIRefreshControl alloc] init];
}
...
}
最新の iOS 機能を使用するすべてのクラスに同じコードを追加する必要があるため、このソリューションはクールではありません。
考えられるクールな解決策: 1) 独自の 100% 互換クラスを取得または作成します。たとえば、UIRefreshControl の場合、CKRefreshControl (https://github.com/instructure/CKRefreshControl) を使用できます。2) Objective-C ランタイムを使用して、アプリの起動時に置換クラスをメイン クラスとして定義します。
pseudocode
...
// ios 5 compatibility
#include <objc/runtime.h>
#import "CKRefreshControl.h"
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
// pre-ios 6 compatibility
if([[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
// register refresh control
Class clazz = objc_allocateClassPair([CKRefreshControl class], "UIRefreshControl", 0);
objc_registerClassPair(clazz);
}
...
}
この方法はとてもクールだと思いますが、このコードは機能しません。