2009-05-26 23 views
3

例:クラスのインスタンスを動的に作成するにはどうすればよいですか?

UIViewController *controller = [[MyViewController alloc] initWithNib]; 

(-initWithNibはのUIViewControllerサブクラスのカスタムメソッドであることに注意してください):私はすべての割り当てられたと同じように初期化されている10のView Controllerを、持っている

次のView ControllerクラスはOtherViewControllerなどです。私はビューコントローラを必要に応じて遅れてロードしたいと思う。しかし、そうするためには、私はそれを初期化することができるように、私は与えられたインデックスのための対応するクラスを与える何らかの種類の "配列"を持っている必要があります。

大規模なswitch文を使ってメソッドを作成することになりました。これは、単一のView Controllerごとに個別の割り当てと初期化を行うだけです。私はそれに満足していない。変数に適切なクラスを割り当ててから、switch文の最後に変数からそのクラスを割り当てて初期化すれば、はるかに良いでしょう。

これを達成する方法はありますか?

編集:私は機能

id class_createInstance(Class cls, size_t extraBytes) 

を見つけたし、すべてのクラスは、プロパティ「クラス」を持っているようです。しかし、私はそれをインスタンス変数に割り当てることはできません。これは機能しません:

Class cls = [UIImage class]; 
cls *image = [cls imageNamed:@"avatar.png"]; 

最初の行がコンパイルされます。しかし、2番目のエラーは: "イメージが宣言されていません"。

+3

http://stackoverflow.com/questions/381793の正確な複製のように見えます – smorgan

+1

私は基本的な工場パターンを含むように私の答えを編集しました。 id image = [cls imageNamed:@ "avatar.png"]とするといいでしょう。ただし、ここでは共通の基本タイプ(UIImage * image = ...)を使用することをおすすめします。質問の最初の部分がそうであることを示すためです。 – Jason

答えて

13

コンパイル時にクラスの名前がわかっている場合は、そのクラスをクラス変数に割り当てることができます。 、そのメソッドがMyFactoryという名前のクラスで定義されていると仮定すると、

-(UIViewController*)createViewController:(int)classid 
{ 
    return [[factory[classid] alloc] init]; 
} 

static Class factory[2]; 

factory[0] = [MyViewController1 class]; 
factory[1] = [MyViewController2 class]; 
... 

その後、あなたは(CLASSIDが目的のクラスにマップするコンパイル時に知られている一定になる可能性があります。たとえばあなたがして行うことができます:あなたは、クラスのコンパイル時の名前を持っていない場合

MyFactory * fac = [[MyFactory alloc] init]; 
UIViewController * v1 = [fac createViewController: 0]; // typed 
id v2 = [fac createViewController: 1]; // untyped 

が、あなたは、単に次の操作を行うことができます。

#include <objc/objc-runtime.h> 

id object = [[NSClassFromString(@"TheClassName") alloc] init]; 

元の質問にはUIViewControllerのセットが含まれているため、後者の方法で型の安全性を失う理由はありません。私がこの最後の月についてブログ

0

あなたが望むものは反射です。しかし、この言葉はGoogleの答えをより良くするのに役立つかもしれません。

+0

-1?私に休憩を与える - それは完全に正しい答えであり、最初は1時間後の唯一の答えだった。特定の言語がわからないからといって、答えが間違っているということを意味するわけではありません。別のユーザーがその質問に答える手助けをしている可能性があります。このサイトの人々の中には、あまり真剣に受け止めたり、新しい趣味を見つける必要がある人もいます。 – Gandalf

+1

何らかの理由で不適当と答えた人はいつも投票します。あなたはdownvoteがあなたにかかるコストよりもupvoteに対してはるかに多くのクレジットを得ます。気にしないでください。血圧には悪いです。 – mmc

6

あなたは、リフレクションを使用したい:

id controller = class_createInstance(NSClassFromString(@"your class name"), 0/*extra bytes*/); 

Objective-C Runtime Reference

+0

私は警告を受け取りました: "暗黙の関数 'class_createInstance'の宣言 – Thanks

+1

#import

+0

@arul、[NSClassFromString(@" MyClass ")alloc] init ]? –

0

Objective Cのリファレンスでも通話を取得するために見て良い場所になります。

1

:基本的に http://igotosoft.blogspot.com/2009/05/dynamically-creating-viewscontrollers.html 、それはクラス名に、initメソッド名、およびカンマ区切りの引数を取り、私はClassConstructor呼んで新しいクラスを、必要とします。そのクラスのインスタンスを作成する必要があるときは、[myClassConstructor create]を使用します。

関連する問題