0

rootController と 5 つの contentControllers があり、それぞれが独自のクラスになっています。

現在のコンテンツ コントローラーから次のコンテンツ コントローラーを呼び出せるようにしたい。たとえば、現在 contentController1 を表示している場合、contentController2 を表示する方法が必要です。

新しいコントローラーをロードして表示する実際のメソッドに呼び出されるコントローラーの番号を渡す短いメソッドをすべてのコントローラーの実装ファイルに追加できれば理想的です。

例えば:

@implementation ContentController1

- (int) loadNextController {
  //take the 1 from ContentController1, add 1 to it, and pass it somewhere else
}

次に、別の場所 (ルート コントローラ? アプリ デリゲート?) に次のメソッドを追加します。このメソッドは、(int) loadNextController メソッドから送信された int に基づいて contentController をロードして表示します。

-(void) loadNextController: (int) nextController {
//init and show controller
}

コードと、さらに重要なことに、それがどこにあるのかを見せていただければ、本当に感謝しています。

トレバー

4

1 に答える 1

0

これらのビュー コントローラーを相互にどのように関連付けるかは明確ではありません。たとえば、ナビゲーション コントローラーのスタックにそれぞれを順番にプッシュして、ユーザーが常に前のビュー コントローラーに戻ることができるようにすることができます。または、ユーザーが戻るオプションなしで 5 つのコントローラーを連続して通過する必要があるという要件がある場合があります。この決定によって、各コントローラーのビューを表示するコードをどのように記述するかが決まります。詳細については、 View Controller プログラミング ガイドを参照してください。

上記の設計では、各View Controllerが次に表示するView Controllerを決定します。多くの場合、特にビュー コントローラーが階層を形成する場合に適切です。ただし、あなたの説明からすると、コントローラーが 1 つのオブジェクトに表示される順序に関するすべての知識を集中させることが役立つようです。そのオブジェクトを各コントローラーのデリゲートにし、そのオブジェクト (おそらくアプリケーション デリゲート) がコントローラーの順序を決定するようにします。(テストされていない) 例として、これをアプリのデリゲートに追加できます。

-(void)application:(UIApplication*)app didFinishLaunchingWithOptions:(NSDictionary*)options
{
    //...
    self.controllers = [NSArray arrayWithObjects:
                   [[[ViewControllerA alloc] initWithNibName:nil bundle:nil] autorelease],
                   [[[ViewControllerB alloc] initWithNibName:nil bundle:nil] autorelease],
                   //...
                   [[[ViewControllerN alloc] initWithNibName:nil bundle:nil] autorelease]];

    // Make self the delegate for each of the view controllers.
    [self.controllers setValue:self forKey:@"delegate"];

    [self.navigationController pushViewController:[self.controllers objectAtIndex:0] animated:NO];
}

-(void)viewControllerDidFinish:(UIViewController*)controller
{
    NSUInteger index = [self.controllers indexOfObject:controller];
    NSUInteger nextIndex = index + 1;

    if (nextIndex < [self.controllers count]) {
        [self.navigationController pushViewController:[self.controllers objectAtIndex:nextIndex animated:YES];
    }
}

次に、View Controller が次のコントローラーに切り替える準備ができたら、次のように呼び出すことができます。

[self.delegate viewControllerDidFinish:self];

繰り返しますが、ここでの考え方は、配列内のビュー コントローラーの順序によって、コントローラーが表示される順序が決まるということです。ここではナビ コントローラーを使用しましたが、その必要はありません。また、おそらく -viewControllerDidFinish:(UIViewController*)controller メソッドでプロトコルを宣言し、アプリのデリゲート (またはコントローラーを管理するオブジェクト) でそのプロトコルを採用し、コントローラーのデリゲート プロパティでそのプロトコルを指定する必要があります。これにより、デリゲートがメソッドを実装していないという警告が回避されます。

于 2011-04-08T05:22:36.357 に答える