Iphone ChildViewController在父视图控制器中推送而不是替换视图

Iphone ChildViewController在父视图控制器中推送而不是替换视图,iphone,ios,cocoa-touch,segue,Iphone,Ios,Cocoa Touch,Segue,我有以下设置 当我触摸任一按钮时,相应targetViewController的内容应显示在按钮下方的白色框中 这很好(请参见下面的代码),但只要我将ParentViewController包含在导航控制器中,ViewController就会将“First”标签推送到视图,而不是将其添加到ParentViewController视图的框中 这两个序列都被定义为“自定义”,那么为什么会发生推送呢 这是我显示ViewController的代码: -(void)swapVC:(UIViewContr

我有以下设置

当我触摸任一按钮时,相应targetViewController的内容应显示在按钮下方的白色框中

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

这两个序列都被定义为“自定义”,那么为什么会发生推送呢

这是我显示ViewController的代码:

-(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];        
    }

}

你不应该使用segue。要切换视图控制器时,请使用从ViewController:toViewController:duration:options:animation:completion的转换方法。segue将简单地将视图控制器推送到堆栈上,可能是因为自定义segue未定义


编辑:您可以将序列保留在那里,但如果执行它们,它会将其推到堆栈上。

您不应该使用序列。要切换视图控制器时,请使用从ViewController:toViewController:duration:options:animation:completion的转换方法。segue将简单地将视图控制器推送到堆栈上,可能是因为自定义segue未定义

编辑:您可以将序列保留在那里,但如果执行它们,它会将其推到堆栈上。

苹果的解决方案 使用
UITabBarController
代替导航控制器。它内置了这个功能

如果这不是一个选项,继续阅读下面的内容

了解导航控制器以及何时使用它们 导航控制器维护viewcontroller的堆栈(),并在堆栈顶部显示viewcontroller。它使用“推送”和“弹出”视图控制器到堆栈上的分段,在此堆栈中添加和删除视图控制器。这对于具有清晰的屏幕流层次结构的情况非常有用,例如显示常规信息的UITableView和显示有关在UITableView中选择的项目的详细信息的UIViewController。在本例中,UITableView清楚地引导您找到详细的viewcontroller

尽可能使用Apple的导航控制器和tabbar控制器。它们既方便又制作精良。然而,当这些都不行时,我们必须自己处理转换

在您的情况下,似乎没有一个清晰的视图流层次结构(您的父视图持有一个可以更改的视图,但您的父视图不会“在第一个和第二个子视图之前”或“在第二个子视图之后”),所以让我们开始进行转换


简单的解决办法 因此,我们希望视图发生更改,但不希望使用将视图(更准确地说,它将具有这些视图的ViewController)推送到堆栈上的导航控制器。如果不使用导航控制器,请清除情节提要中的segue和代码中的segue方法(同时将父视图控制器设置为根视图)。要执行此操作,请进入sotryboard,选择父视图控制器并使用实用工具工具栏选中标记为“is Initial view controller”的框。如果出现任何问题,请确保选择了viewcontroller,而不是视图)。最简单的方法是使用:

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

从故事板实例化控制器 通过在父视图控制器中实例化两个子视图控制器,可以获得“第一”和“第二”视图控制器,如下所示:

firstVC = [self.storyboard instantiateViewControllerWithIdentifier:firstIdentifier];
secondVC = [self.storyboard instantiateViewControllerWithIdentifier:secondIdentifier];
其中,故事板中定义了
firstIdentifier
secondIdentifier
。 (在序列图像板中选择一个viewcontroller,然后转到实用工具工具栏顶部的属性检查器选项卡。该选项卡看起来像一个盾牌/主页板。在属性检查器的相应文本字段中定义标识符。在实际代码中,标识符是一个NSString*例如@“我的视图控制器”)

苹果的解决方案 使用
UITabBarController
代替导航控制器。它内置了这个功能

如果这不是一个选项,继续阅读下面的内容

了解导航控制器以及何时使用它们 导航控制器维护viewcontroller的堆栈(),并在堆栈顶部显示viewcontroller。它使用“推送”和“弹出”视图控制器到堆栈上的分段,在此堆栈中添加和删除视图控制器。这对于具有清晰的屏幕流层次结构的情况非常有用,例如显示常规信息的UITableView和显示有关在UITableView中选择的项目的详细信息的UIViewController。在本例中,UITableView清楚地引导您找到详细的viewcontroller

尽可能使用Apple的导航控制器和tabbar控制器。它们既方便又制作精良。然而,当这些都不行时,我们必须自己处理转换

在您的情况下,似乎没有一个清晰的视图流层次结构(您的父视图持有一个可以更改的视图,但您的父视图不会“在第一个和第二个子视图之前”或“在第二个子视图之后”),所以让我们开始进行转换


简单的解决办法 因此,我们希望视图发生更改,但不希望使用将视图(更准确地说,它将具有这些视图的ViewController)推送到堆栈上的导航控制器。如果不使用导航控制器,请清除情节提要中的segue和代码中的segue方法(同时将父视图控制器设置为根视图)。要执行此操作,请进入sotryboard,选择父视图控制器并使用实用工具工具栏选中标记为“is Initial view controller”的框。如果出现任何问题,请确保选择了viewcontroller,而不是视图)。最简单的方法是使用:

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

从St实例化控制器