ChildViewController推送而不是替换Parent ViewController中的视图

时间:2012-07-20 15:36:22

标签: iphone ios cocoa-touch segue

我有以下设置

http://i.minus.com/j6rhBqXOkRRjl.png

当我触摸其中一个按钮时,相应targetViewController的内容应出现在按钮下方的白色框中。

这很好用(请参阅下面的代码),但是只要我将ParentViewController包含在导航控制器中,ViewController就会使用“First”标签推送到View,而不是将其添加到ParentViewController视图的框中。

两个segue都定义为“Custom”,为什么会发生推送?

这是我显示ViewControllers的代码:

-(void)swapVC:(UIViewController *)newController{

    if(_currentViewController){
        [_currentViewController removeFromParentViewController];
    }

    [self addChildViewController:newController];
    [self.contentView addSubview:newController.view];

    [newController didMoveToParentViewController:self];    
}


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if([segue.identifier isEqualToString:@"showFirst"]){

        [self swapVC:segue.destinationViewController];
    } else if([segue.identifier isEqualToString:@"showSecond"]){
        [self swapVC:segue.destinationViewController];        
    }

}

2 个答案:

答案 0 :(得分:2)

你不应该使用segue。如果要切换视图控制器,请使用transitionFromViewController:toViewController:duration:options:animation:completion方法。 segue只会将视图控制器推到堆栈上,可能是因为自定义segue未定义。

编辑:您可以将segue留在那里,但如果您执行它们,它会将它推入堆栈。

答案 1 :(得分:1)

Apple的解决方案

使用UITabBarController代替导航控制器。它内置了这个功能!

如果那不是一个选项,请继续阅读以下内容......

了解导航控制器以及何时使用它们

导航控制器维护视图控制器的堆栈(first in, first out),并在堆栈顶部显示视图控制器。它添加和删除了来自此堆栈的viewcontrollers,其中segues将viewcontrollers“推”并“弹出”到堆栈上。当您拥有清晰的屏幕流层次结构(例如显示常规信息的UITableView)和显示有关在UITableView中选择的项目的详细信息的UIViewController时,这非常适用。在这个例子中,UITableView清楚地引导您进入详细的viewcontroller。

尽可能尝试使用Apple的导航控制器和标签栏控制器。它们方便,制作精良。然而,当这些不行时,我们必须自己处理过渡......

在您的情况下,似乎没有清晰的视图流层次结构(您的父视图包含可以更改的视图,但您的父视图不会“先到”或“继续”您的第一个和第二个子视图),让我们开始进行过渡。


一个简单的解决方案

因此,我们希望我们的视图可以更改,但不能使用导航控制器将视图(更准确地说是将具有这些视图的视图控制器)推送到其堆栈上。如果你没有使用导航控制器,那么摆脱故事板中的segue和代码中的segue方法(也让你的父视图控制器成为根视图。为此,进入sotryboard,选择你的父视图控制器并使用Utilities用于选中标记为“是初始视图控制器”的框的工具栏。确保选中了视图控制器,而不是视图,如果这给您带来任何问题)。最简单的方法是使用:

transitionFromViewController:toViewController:duration:options:animations:completion:

从故事板中实例化控制器

您可以通过在父视图控制器中实例化您的两个子视图控制器来获取“第一个”和“第二个”视图控制器:

firstVC = [self.storyboard instantiateViewControllerWithIdentifier:firstIdentifier];
secondVC = [self.storyboard instantiateViewControllerWithIdentifier:secondIdentifier];

其中firstIdentifiersecondIdentifier在故事板中定义。 (在故事板中选择一个viewcontroller,然后转到Utilities工具栏顶部的Attributes Inspector选项卡。该选项卡看起来像一个盾牌/本垒板。在Attributes Inspector的相应文本字段中定义标识符。在实际代码中,标识符是NSString *例如@“我的视图控制器”)