0

我有一个 rootController 和 5 个 contentController,每个都有自己的类。

我希望能够从当前内容控制器调用下一个内容控制器。例如,如果我当前正在显示 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

目前尚不清楚您希望这些视图控制器如何相互关联。例如,您可能希望将每一个依次推送到导航控制器的堆栈中,以便用户始终可以选择返回之前的视图控制器。或者,您可能有一个要求,即用户必须连续通过五个控制器而没有返回选项,在这种情况下,您可能会在时机成熟时将窗口的 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 方法声明一个协议,在您的应用程序委托(或管理控制器的任何对象)中采用该协议,并让您的控制器的委托属性指定该协议。这将避免任何有关委托未实现该方法的警告。

于 2011-04-08T05:22:36.357 回答