我该如何在iOS 5中使用嵌入式Segue?

5

iOS 6引入了Embed Segue,允许在Storyboards中使用自定义容器控制器。有没有办法在iOS 5中复制这个功能呢?

2个回答

9
这里的挑战在于子视图控制器的视图通常会作为父视图控制器的某个容器视图的子视图添加。由于您无法从随机的UIView控件创建segue,因此无法从UIView容器视图创建segue到子场景。因此,您只需要自己编写代码。

幸运的是,它只是那四行代码,可以参考来自View Controller Programming Guide中的添加子控制器。就我个人而言,我可能会稍微修改一下代码,使其定义在我的视图控制器中:

- (void) displayChildController:(UIViewController*)childController
                inContainerView:(UIView *)containerView
{
   [self addChildViewController:childController];                 // 1
   childController.view.frame = containerView.bounds;             // 2
   [containerView addSubview:childController.view];
   [childController didMoveToParentViewController:self];          // 3
}

我曾经为改变一个场景中的活动子控制器编写过自定义segue,但它本质上只是上述参考文档中列出的代码的变体。但这不是关于嵌入segue的问题,因此在此并不相关。


你如何在仍使用iOS 6容器视图的情况下完成这个操作?我本来以为segue会失败,但是当实例化UIViewController时,苹果公司却出现了严重的崩溃。(苹果公司在这里进行了严重的黑客攻击?我很惊讶一个不兼容、破坏应用程序的“嵌入式segue”竟然是他们能想到的最好的东西 :() - Adam
@Adam,我们把这个转移到聊天室吧:http://chat.stackoverflow.com/rooms/36209/adam-and-rob-segues-and-container-views-in-ios-6 - Rob

-1
我通过子类化UIStoryboardSegue来复制功能。 在Interface Builder中,我创建了一个自定义segue,并将其类设置为我的子类(QCEmbedSegue)。在我的父视图控制器的viewDidLoad中,我调用performSegueWithIdentifier:sender。 QCEmbedSegue仅覆盖了perform:方法。
- (void)perform
{
    [self.sourceViewController addChildViewController:self.destinationViewController];
    [[self.sourceViewController view] addSubview:[self.destinationViewController view]];
    [self.destinationViewController didMoveToParentViewController:self.sourceViewController];
}

http://www.quentamia.com/blog/embed-segue-in-ios-5/


不用说,只有将子场景添加到父控制器的顶级视图中才能正常工作。但这是一个可贵的尝试。 - Rob
@Rob 非常正确。在我的情况下,这就是我所需要的。它可以被构建成允许在视图层次结构中的任何位置插入。 - Quentamia

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