0

我有以下设置

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

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

这很好用(请参阅下面的代码),但是一旦我将 ParentViewController 包含在 Navigation Controller 中,ViewController 就会使用“First”标签推送到 View,而不是将其添加到 ParentViewController 视图上的框中。

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

这是我显示 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];        
    }

}
4

2 回答 2

2

You shouldn't use a segue. Use the transitionFromViewController:toViewController:duration:options:animation:completion method when you want to switch view controllers. The segue will simply push the view controller on the stack, probably because the custom segue is undefined.

EDIT: You can leave the segues in there, but if you perform them, it will push it onto the stack.

于 2012-07-20T16:22:59.150 回答
1

苹果的解决方案

使用 aUITabBarController而不是导航控制器。它内置了这个功能!

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

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

导航控制器维护视图控制器的堆栈(先进先出),并在堆栈顶部显示视图控制器。它使用将视图控制器“推送”和“弹出”到堆栈上的序列来从该堆栈中添加和删除视图控制器。当您有一个清晰的屏幕流层次结构时,这非常有用,例如显示一般信息的 UITableView,以及显示有关在 UITableView 中选择的项目的详细信息的 UIViewController。UITableView 清楚地将您带到此示例中的详细视图控制器。

尽可能尝试使用 Apple 的导航控制器和标签栏控制器。它们方便且制作精良。但是,当这些都不起作用时,我们必须自己处理转换......

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


一个简单的解决方案

因此,我们希望我们的视图发生变化,但不是通过使用将视图推送到其堆栈的导航控制器(更准确地说,它推送具有这些视图的视图控制器)。如果您不使用导航控制器,请摆脱故事板中的 segue 和代码中的 segue 方法(也使您的父视图控制器成为根视图。为此,进入 sotryboard,选择您的父视图控制器并使用实用程序工具栏以选中标记为“初始视图控制器”的框。如果这给您带来任何问题,请确保选择视图控制器,而不是视图)。最简单的方法是使用:

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

从 Storyboard 实例化控制器

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

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

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

于 2012-07-20T18:26:50.957 回答