0

これが私のセットアップです。一度サブクラス化UIViewControllerして、すべてのウィジェットで実行できるすべてを処理する単一の「ウィジェット」ビュー コントローラーを作成しました。次に、各ウィジェットの Widget View Controller をサブクラス化しました。これは、各ウィジェットが独自の、しばしば複雑な一連の機能を処理するためです。

シーンにアクティブな各ウィジェットを格納するウィジェットの配列を作成したいのですが、適切なウィジェットを初期化して配列に格納する方法がわかりません。最初はできると思っていまし [widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]];たが、個々のウィジェットの initWithNibName 関数を完全に無視し、抽象化された Widget クラスに直接進みます (これは、私がロードしているクラスであるため、理にかなっています...)。

各ウィジェットが独自のサブクラスによって初期化された状態で、クラスをこの配列に適切にロードするにはどうすればよいですか? 必要に応じて、構造変更もお気軽にお勧めします。

4

3 に答える 3

2

クラスの名前が nib と同じ場合

NSArray* widgets = [NSArray arrayWithObjects: @"MyVC1",@"MyVC2",nil];

NSString* newVC = [widgets objectAtIndex: value];

Class classVC = NSClassFromString(newVC);

Widget* controller = [[classVC alloc] initWithNibName:newVC bundle:nil];
于 2012-05-14T13:37:56.197 に答える
0

これの代わりに:

[widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]];

あなたはこれを行うことができます:

MySpecifc *mySpecificWidget = [[MySpecifc alloc] initWithNibName:widgetName bundle:nil];
[widgets addObject:myWidget];

ここでの私の質問は、これはどこにNSMutableArray保存されているのですか?

ミャベにはシングルトンがあるので、それらを追跡できますか?

于 2012-05-14T13:24:45.967 に答える
0

同様の問題があり、「抽象」ウィジェットクラスで次のような関数を使用して問題を解決しました。

+ (Widget)InstanceFor(widgetType)type {
    switch(type) {
        case widgetTypeWidgetOne:
            return [[WidgetOne alloc] initWithNibName:@"WidgetOneName" bundle:nil] autorelease];
            break;
        case widgetTypeWidgetTwo:
            return [[WidgetTwo alloc] initWithNibName:@"WidgetTwoName" bundle:nil] autorelease];
            break;
    }
}

widgetTypeは次のとおりです

typedef enum {
    widgetTypeOne,
    widgetTypeTwo
} widgetType;

したがって、Widget オブジェクトを配列に格納し、必要なときにキャストできます。ウィジェットを初期化する場合は、次のようにします。

[widgets addObject:[Widget InstanceFor:widgetTypeWidgetOne]];
于 2012-05-14T13:29:29.927 に答える