将navigationcontroller添加到splitview中的详细信息视图

时间:2010-09-23 07:28:55

标签: iphone objective-c ipad

我正在关注此示例:http://doronkatz.com/ipad-programming-tutorial-hello-world。 这个例子效果很好。

现在我想在splitview中使用3个选项卡,并为每个选项卡添加一个新的navigationcontroller。 但我不知道如何实现它。 我转到这段代码:

- (void)setDetailItem:(id)newDetailItem {
if (detailItem != newDetailItem) {
    [detailItem release];
    detailItem = [newDetailItem retain];

    // Update the view.
    navigationBar.topItem.title = detailItem;

    if ([detailItem isEqualToString:@"Test"]) {
        TestViewController *testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle:nil];
        [self.navigationController pushViewController:testViewController animated:NO];
        [mapViewController release];

    }
    if ([detailItem isEqualToString:@"Test2"]) {

    }

}

if (popoverController != nil) {
    [popoverController dismissPopoverAnimated:YES];
}        

但我知道我实际上不必使用'pushviewcontroller',我只想从这一点开始一个新的navigationcontroller,因此对于splitview中的每个选项卡。我怎么能做到这一点?我知道这是非常基本的,但我无法弄明白。

感谢。

2 个答案:

答案 0 :(得分:2)

根据我的理解,你需要一个拆分视图控制器作为主控制器。左侧面板将选择一个项目,该项目的右侧详细视图将包含3个选项卡。每个选项卡都有一个导航控制器。应用商店遵循类似于详细视图的模式。

将控制器构建为树是很重要的。

  • root:拆分视图控制器
    • 列表视图:表控制器(用于选择水果的MasterViewController)
    • 详细视图:标签控制器(关于西瓜的所有信息)
      • tab1:导航控制器
        • 第1页:第一个标签根控制器(西瓜的历史)
      • tab2:导航控制器
        • 第1页:第一个标签根控制器(西瓜农场地图)
      • tab3:导航控制器
        • 第3页:第一个标签根控制器(西瓜食谱)

使用此模式,您可以在viewDidLoad上创建控制器结构,但在响应setDetailItem时更改第1,2,3页的内容 UINavigatorContoller有一个popToRootViewControllerAnimated消息,可以为3个导航控制器中的每一个重置以前的导航控制器堆栈。当我开始学习ios开发时,我发现在代码中设置控制器层次结构比使用界面构建器更容易。一旦获得概念,IB就会更快。您仍然可以为page1,2,3根视图控制器创建IB nib控制器。

好参考:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457

答案 1 :(得分:0)

如果我理解正确,你有一个UISplitViewController,你希望有三个UINavigationControllers作为详细视图。在这种情况下,如果在UISplitViewController类中实现,则以下内容将起作用:

    if ([detailItem isEqualToString:@"Test"]) {

        TestViewController *testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle:nil];

        //since self.viewControllers is immutable, let's make our own temporary copy.
        NSMutableArray *tempArray = [self.viewControllers mutableCopy];

        //switcheroo with the new view controller
        [tempArray replaceObjectAtIndex:1 withObject:testViewController];

        // our new view controller is retained by the array, so let's release it
        [testViewController release];

        //set the new array to be displayed
        self.viewControllers = tempArray;

        //clean up - out mutableCopy returns a retained object
        [tempArray release];


    }