0

私のアプリには、インターフェースで宣言された多数のビューコントローラーがあります。例:

ViewController_1_0 *viewController_1_0
ViewController_1_1 *viewController_1_1
ViewController_1_2 *viewController_1_2
etc ...

(アンダースコアはクラス名のCocoaコーディング規則としては適切ではないことを認識しており、これを変更します。)

私の意図は、現在のUIStepper値に基づいて適切なコントローラービューを表示することです。

ステッパー値ごとに条件付きテストを実行してから、「ハードコードされた」ビューコントローラーを使用してコントローラーオブジェクトの個別の遅延インスタンス化を実行するのではなく、現在のステッパー値に基づいて構築された文字列を使用してコードを一度表示させようとしています。

私は(変数に格納されたクラス名を使用してClassメソッドを呼び出すのを助けて?)クラス名を設定する方法を理解しました:プロパティを宣言しました:

@property(strong, nonatomic) Class classStringClass;

そして、クラスの変数文字列を作成した後、次のようにします。

classStringClass = NSClassFromString(classString);

ここで、classStringは、ステッパー値を使用して作成された文字列です。たとえば、ViewController_1_0と同等です。

また、ivarのプロパティを次のように宣言しました。

@property (strong, nonatomic) NSString *classInstanceString;

したがって、私はします:

if(!classInstanceString) {
   classInstanceString = [[classStringClass alloc] initWithNibName:classString bundle:nil];
}

私が立ち往生しているのは、コントローラーのivarをコーディングする方法です。つまり、インターフェイスで宣言されたivar viewController_1_0(またはステッパー値に基づくもの)と同等になるように構築されたclassInstanceStringです。怠惰なインスタンス化ifステートメントから抜け出し、次にclassInstanceStringのプロパティにアクセスするためのコードを記述します。次に例を示します。

classInstanceString.view.hidden = NO;

classInstanceStringは、当然のことながら、「プロパティ'ビュー'がタイプ'NSString'のオブジェクトに見つかりません」というエラーを受け取ります。

'classInstanceString'(またはclassInstanceString値を含む'classInstanceVariable'などの別の変数)を宣言するにはどうすればよいですか?インスタンス化するとき、それはclassStringClassのivarであり、クラスのインスタンス化の後に使用するためにクラスプロパティにアクセスできますか?NSStringとは異なるタイプである必要があると思いますが、それはどのタイプでしょうか、それともこれを行う別の方法がありますか?

4

1 に答える 1

0

基本的なUIViewControllerivarが必要な場合は、いつでもUIViewControllerにキャストできます。

UIViewController *vc = (UIViewController *)[[classStringClass alloc] initWithNibName:classString bundle:nil];

[vc view];// works!

または、カスタムivarが必要な場合は、次のようにすべてが基本クラス(またはプロトコル)を拡張することをお勧めします。

MyBaseViewController *vc = (MyBaseViewController *)[[classStringClass alloc] initWithNibName:classString bundle:nil];

[vc customVar]; //works
于 2012-07-28T22:47:24.030 に答える