これらのビュー コントローラーを相互にどのように関連付けるかは明確ではありません。たとえば、ナビゲーション コントローラーのスタックにそれぞれを順番にプッシュして、ユーザーが常に前のビュー コントローラーに戻ることができるようにすることができます。または、ユーザーが戻るオプションなしで 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 メソッドでプロトコルを宣言し、アプリのデリゲート (またはコントローラーを管理するオブジェクト) でそのプロトコルを採用し、コントローラーのデリゲート プロパティでそのプロトコルを指定する必要があります。これにより、デリゲートがメソッドを実装していないという警告が回避されます。