2

我正在开发一个应用程序,它本质上是一系列不同的测试(为简单起见,考虑 SAT 测试或 Mensa 测试)。每个测试都在不同的 View+View Controller 中实现。

最初我想使用 Storyboards 和 UINavigationControllers 来管理测试的顺序和它们之间的转换,但现在我质疑这种方法的有效性。UINavigationController 是一个堆栈,而我的导航是单向的(一旦你完成了测试,你就不能返回)。有没有更好的方法来实现该应用程序?我还能以某种方式利用故事板吗?

4

3 回答 3

8

我会使用自定义容器视图控制器。因此,在您的主要场景中,添加一个“容器视图”。如果您的目标是 iOS6,那么在编辑情节提要时会有一个特殊的“容器视图”对象,您现在可以将其拖到自定义容器视图控制器的场景中:

容器视图

如果是 iOS 5,那么 (a) 您必须手动创建第一个子场景;(b) 给它一个唯一的故事板 ID(在我的示例中InitialChild,和 (c) 您手动实例化第一个子控制器并以编程方式将其添加为子控制器。因此,假设您在自定义容器视图控制器的场景中有一个UIView调用containerView,您可以有这样的方法:

- (void)addInitialChild
{
    UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"InitialChild"];

    [self addChildViewController:child];
    child.view.frame = self.containerView.bounds;
    [self.containerView addSubview:child.view];
    [child didMoveToParentViewController:self];
}

当您想过渡到下一个场景时,将您自己的子类化UIStoryboardSegue

在 ReplaceSegue.h 中:

@interface ReplaceSegue : UIStoryboardSegue

@end

在 ReplaceSegue.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”作为类(只需单击转场将其选中,然后查看“属性检查器”) .

在此处输入图像描述

生成的故事板可能如下所示(注意{}各个子项之间的“ ”名称):

收容故事板


参考:

于 2013-01-02T16:30:50.003 回答
0

然后只需加载下一个视图控制器并用新视图替换当前视图(在某些顶级视图或应用程序窗口中)。如果需要,请添加动画。有什么问题?

于 2013-01-02T16:16:19.340 回答
0

您还可以使用视图动画来避免推送视图控制器。您可以像推送 VC 一样提供视图动画

于 2013-01-02T16:18:37.267 回答