1

問題: すべての新しい 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);
    }

    ...
}

この方法はとてもクールだと思いますが、このコードは機能しません。

4

4 に答える 4

0

さまざまな方法で1つの一貫したインターフェースを作成することをお勧めします。問題を解決するには、戦略設計パターンが必要です 。次に、バージョンを1回だけチェックする必要があります-iOSバージョン固有のジョブを実行しているオブジェクトの初期化時に。

于 2012-10-26T10:34:02.560 に答える
0

@abuharsky、[CKRefreshControl] https://github.com/instructure/CKRefreshControlが更新され、まさにあなたが求めていることを実行するようになりました。あなたがする必要があるのは、次のとおりです。

self.refreshControl = [[UIRefreshControl alloc] init];

それがうまくいかない場合はお知らせください。

于 2013-01-28T23:02:02.267 に答える
0

すべてのメソッド呼び出しが同一である (そして、話すクラス/「静的」メソッドがない) 場合は、単純に「ファクトリ」メソッドを使用してオブジェクトを作成し、それらを「通常どおり」使用します。

それ以外の場合は、Filip の投稿のテストの 1 つに基づいて、呼び出しを組み込みサポートまたは「置換」のいずれかに再ルーティングする「ラッパー」クラスを使用するでしょう。

于 2012-10-26T10:49:47.643 に答える
0

2 番目の解決策は正常に動作するはずです。ARCが有効になっ
いると問題が発生する可能性があるため、allocate_pair コードをフラグ付きでコンパイルされたクラスに移動する必要があります。-fno-objc-arc

詳細については、こちら (コメント) を参照してください:
http://www.mikeash.com/pyblog/friday-qa-2010-11-6-creating-classes-at-runtime-in-objective-c.html

于 2012-12-05T18:27:22.973 に答える