更改子视图控制器

9

我有一个视图控制器,当我按下一个按钮时,会出现一个子视图控制器。这个功能非常完美,但是如果我按下这个按钮内部的下一个按钮来执行两步登录,我想要更改这个子视图控制器为其他一个。 有什么想法吗?因为从主视图控制器中,我知道如何显示一个子视图,但从子视图控制器中,我不知道如何做到。


1
假设我们在谈论自定义容器视图控制器,您可以让子视图调用一个方法返回给父视图执行转换。或者您可以进行自定义Segue以替换子控制器:http://stackoverflow.com/questions/14125145/ios-best-practices-for-a-one-way-navigation-controller/14125580#14125580 - Rob
谢谢你的回答。所以我必须返回到父级并将另一个视图控制器显示为子级。但是如何知道我想显示另一个视图控制器。因为我尝试像segue一样替换子级,但新的视图控制器出现在所有窗口中,而不是像第一个视图控制器那样。 - Anna
好的,最终我得到了替换子视图的自定义Segue。 :) - Anna
1个回答

44
如果使用故事板,您可以创建自己的子替换转场,例如:

ReplaceSegue.h

@interface ReplaceSegue : UIStoryboardSegue

@end

替换Segue.m

@implementation ReplaceSegue

- (void)perform
{
    UIViewController *source = self.sourceViewController;
    UIViewController *destination = self.destinationViewController;
    UIViewController *container = source.parentViewController;

    [container addChildViewController:destination];
    destination.view.frame = source.view.frame;
    [source willMoveToParentViewController:nil];

    [container transitionFromViewController:source
                           toViewController:destination
                                   duration:0.5
                                    options:UIViewAnimationOptionTransitionCrossDissolve
                                 animations:^{
                                 }
                                 completion:^(BOOL finished) {
                                     [source removeFromParentViewController];
                                     [destination didMoveToParentViewController:container];
                                 }];
}

@end

接下来,您可以打开故事板,在容器视图控制器上放置一个容器视图,并在子控制器上,从第一个子场景到第二个子场景放置一个自定义转场。您需要为两个子场景之间的自定义转场指定 ReplaceSegue 类:

container controller storyboard

请注意,如果您在第二个子视图上正确使用了自动布局或自动调整大小,一切都将正常工作(特别是在目标控制器视图中手动设置框架的 ReplaceSegue 中)。但是在界面构建器中,第二个子场景的布局看起来不太对,并且可能会使场景的适当设计有点尴尬,因为(至少在 Xcode 4.5 中)第二个子场景的“模拟度量”无法推断出适当的大小。因此,您应该将第二个子场景的模拟度量大小从“推断”更改为“自由形式”,然后手动调整第二个子场景的大小:

container storyboard with manually adjusted second child scene size

这不是很优雅的 Xcode 体验,但它有效。如果您正确使用自动布局或自动大小调整掩码,则可以很好地处理小的变化。


4
请注意,在Child View 1和Child View 2之间添加一个虚拟的“push”segue,可以强制Xcode正确推断度量。 - esad
4
你需要更多的赞! - Sheharyar
如果你需要切换回第一个,有没有一种优雅的方式来处理呢? - tybro0103
@Rob 但如果超过两个呢? - tybro0103
@tybro0103 只需在你要转场的各个子视图控制器之间添加转场效果即可。如果只是从 A 到 B 再到 C,然后回到 A,那就很简单了。但如果有十几个子视图控制器,并且你想要能够从一个转到另一个控制器,那么最好通过编程实现。因为将所有这些转场效果放入故事板中会很乱。 - Rob
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接