目前尚不清楚您希望这些视图控制器如何相互关联。例如,您可能希望将每一个依次推送到导航控制器的堆栈中,以便用户始终可以选择返回之前的视图控制器。或者,您可能有一个要求,即用户必须连续通过五个控制器而没有返回选项,在这种情况下,您可能会在时机成熟时将窗口的 rootViewController 属性设置为每个控制器。您的决定将决定您如何编写呈现每个控制器视图的代码。阅读View Controller Programming Guide了解详情。
您在上面描述的设计让每个视图控制器决定接下来要呈现哪个视图控制器。这通常是合适的,尤其是在视图控制器形成层次结构的情况下。不过,根据您的描述,将所有关于控制器在一个对象中呈现的顺序的知识集中起来似乎会有所帮助。使该对象成为每个控制器的委托,并让该对象(可能是应用程序委托)确定控制器的顺序。作为一个(未经测试的)示例,您可以将其添加到您的应用程序委托中:
-(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];
}
}
然后,每当视图控制器准备好切换到下一个控制器时,它就可以调用:
[self.delegate viewControllerDidFinish:self];
同样,这里的想法是视图控制器在数组中的顺序决定了控制器将呈现的顺序。我在这里使用了导航控制器,但您不必这样做。此外,您可能希望使用您的 -viewControllerDidFinish:(UIViewController*)controller 方法声明一个协议,在您的应用程序委托(或管理控制器的任何对象)中采用该协议,并让您的控制器的委托属性指定该协议。这将避免任何有关委托未实现该方法的警告。