从ViewControllerB显示ViewControllerA

时间:2011-03-20 07:55:58

标签: objective-c ios uiviewcontroller uiapplicationdelegate

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

我希望能够从当前内容控制器调用下一个内容控制器。例如,如果我当前正在显示contentController1,我想要一种显示contentController2的方法。

如果我可以为每个控制器的实现文件添加一个简短的方法,这个方法将要调用的控制器的数量传递给加载并显示新控制器的实际方法,这是理想的。

例如:

@implementation ContentController1

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

然后在其他地方(根控制器?app委托?)添加以下方法,然后根据(int)loadNextController方法发送的int加载并显示contentController:

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

如果你能告诉我代码,更重要的是,它去哪里,我真的很感激。

特雷弗

1 个答案:

答案 0 :(得分: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 *)控制器方法声明协议,在您的app委托中采用该协议(或任何对象管理控制器),并让控制器的委托属性指定该协议。这将避免任何关于代表没有实现该方法的警告。