9

我有一个视图控制器,当我按下按钮时,会出现一个子视图控制器。这非常有效,但是如果我按下其中的下一步按钮来执行两步登录,我想将这个子视图控制器更改为另一个。任何想法?因为从主视图控制器我知道如何显示一个孩子,但从孩子我不知道该怎么做。

4

1 回答 1

44

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

替换Segue.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

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

容器控制器故事板

请注意,如果您在第二个子视图上正确使用了自动布局或自动调整大小,一切都会正常工作(尤其是在 中手动设置目标控制器视图的框架时ReplaceSegue)。但是在 Interface Builder 中,第二个子场景的布局看起来不太正确,并且可能使场景的正确设计有点尴尬,因为(至少从 Xcode 4.5 开始)第二个孩子的“模拟指标”场景不能很好地推断出合适的尺寸。因此,您可能应该将第二个子场景的模拟指标的大小从“推断”更改为“自由形式”,然后手动调整第二个子场景的大小:

具有手动调整的第二个子场景大小的容器故事板

这不是非常优雅的 Xcode 体验,但它确实有效。如果您正确使用自动布局或自动调整蒙版大小,则可以非常优雅地处理细微的变化。

于 2013-01-04T15:40:34.933 回答