Con*_*has 57 xcode cocoa-touch uiviewcontroller ios uistoryboard
您可以将子视图控制器关联到Storyboard中的自定义容器视图控制器吗?
我可以将子视图控制器链接到选项卡视图控制器,我可以将一个视图控制器链接到导航控制器.
我应该怎样对容器VC接受儿童VC?
Ben*_*her 75
作为Caleb和Matt的答案的组合,我做了:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"cpdc_check_embed"]) {
self.checkVC = segue.destinationViewController;
}
}
Run Code Online (Sandbox Code Playgroud)
... checkVC容器控制器上的属性在哪里:
@property (weak,nonatomic) PXPCheckViewController * checkVC;
Run Code Online (Sandbox Code Playgroud)
你只需要将你的embedsegue 设置Storyboard ID为你想要的任何东西(在这种情况下cpdc_check_embed):

...然后检查标识符-prepareForSegue:sender:.
仍然不是一个出口,但比马特(恕我直言)更清洁,比Caleb更具体,你仍然得到一个漂亮的故事板:

Mat*_*att 15
故事板非常好地处理内置容器视图控制器,向子/根视图控制器显示segue,以便清楚地显示关系.子帧和父视图控制器如何分成不同的场景也很好.
如果你想在你自己的项目中实现这个效果,那么有一个技巧并不完美但非常简单.在我的示例中,假设我有一个容器视图控制器,其作用类似于标签栏控制器,只有两个选项卡,"左"和"右".我希望有一个场景代表父视图控制器,两个独立的场景代表'左'子视图控制器和'右'子视图控制器.
即使它是不可能的,如果我可以IBOutlet在容器视图控制器中创建s到不同场景中的子节点,然后在显示我的容器视图控制器时根据UIViewController描述的规则设置父/子关系,那将是很好的.文件.如果我们引用了"左"和"右"子视图控制器,那么我们可以设置关系没问题.
此引用问题的标准解决方案是通过将Object出口拖入容器视图控制器的场景,然后将其类类型指定为子视图控制器类的实例来创建对子视图控制器的引用.
然而,为了让孩子们在像Apple的内置容器这样的不同场景中分开,我们将使用不同的技巧.首先,假设我们在容器类中声明了以下属性ContainerViewController:
@property (nonatomic, strong, readwrite) UIViewController *leftViewController;
@property (nonatomic, strong, readwrite) UIViewController *rightViewController;
Run Code Online (Sandbox Code Playgroud)
在我们的故事板中,选择代表"左"视图控制器的场景.在属性检查器中,将视图控制器的identifier属性设置为"cvc_leftViewController"("cvc_"指的是ContainerViewController,但实际上标识符可以是您想要的任何内容).对右视图控制器的场景执行相同操作,将其标识符设置为"cvc_rightViewController".
现在,插入下面的代码ContainerViewController的viewDidLoad方法:
if (self.storyboard) {
_leftViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_leftViewController"];
_rightViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_rightViewController"];
}
Run Code Online (Sandbox Code Playgroud)
当ContainerViewController从故事板加载时,它将从各自的场景中获取"左"和"右"视图控制器,并通过其属性设置对它们的引用.现在您可以控制子视图控制器实例,您可以根据需要设置父/子关系.要了解如何正确地执行此操作,请参阅UIViewController文档.
这个技巧并不完美,并且有许多警告,但如果你小心,你可以使它适合你的项目.
编辑:尽管这是完全不必要的,也不意味着什么,如果你真的真的希望有从容器到你的孩子的视图控制器,就像苹果公司的内置容器中的情节串连图板显示连接,只需使用上面,然后设置我的方法直接在容器场景和子场景之间进行segue,并且根本不执行那些segues.现在一切都会正常工作,看起来也很漂亮.
您可以将子视图控制器关联到Storyboard中的自定义容器视图控制器吗?
我想你在这里问的是如何将一个场景中的视图控制器连接到另一个场景中的视图控制器的插座.我不相信这是可能的,也许是因为故事板机器可能没有同时加载故事板中的所有场景.
您可能会问这个问题,因为当您从一个场景切换到另一个场景时,您希望将一些信息从一个视图控制器传递到另一个视图控制器.在使用故事板时,这样做的方法是覆盖-prepareForSegue:sender:受segue影响的一个或两个视图控制器.在所提供的UIStoryboardSegue对象segue参数具有sourceViewController和destinationViewController性能,以及一个identifier属性.您可以使用这些属性来标识要在视图控制器之间传输数据的segue.
Ray Wenderlich的博客提供了一个很好的两部分教程,可以帮助您使用故事板:
iOS 5允许多个视图控制器在同一场景中处于活动状态(尽管一个应该仍然负责),因此故事板中的单个场景可能有多个控制器.您可以使用插座将这些控制器相互连接,您可以像在IB中一样配置这些连接:在同一场景中从一个控制器拖动到另一个控制器.通常的插座列表将弹出,让您选择要连接的插座.
在一个场景中使用多个控制器的关键(我相信你在这里之后)正在使用IB中对象列表中的神秘对象来表示另一个视图控制器并连接它的出口.
这个答案如何使用iOS 5中的故事板创建自定义视图控制器容器应该有所帮助.答案还提供了一个非常有用的工作示例应用程序.
@Ben 的(其他合理的)答案的问题在于它仅适用于一层嵌套。除此之外,还需要自定义每个后续 VC 以在 prepareForSegue 中保存嵌套视图控制器。
为了解决这个问题,我花了太多时间探索基于 NSObject 的索引,您可以将其添加到 Storyboard,绑定到场景,然后根据类型和恢复 ID 在全局索引中注册它的父 VC。行得通/能行,但到头来太费力了,还需要视觉绑定和程序化查找两步过程。
对我来说,最简单和最通用的解决方案是懒惰地降低视图控制器层次结构
在我的简单测试项目中,我在 viewDidLoad 中添加了以下几行:
self.left.data = [
"Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro.",
"De carne lumbering animata corpora quaeritis." ]
Run Code Online (Sandbox Code Playgroud)
其中left定义为:
lazy var left:CollectionViewController = { [unowned self] in
return self.childViewControllerWithId("Left") as! CollectionViewController }()
Run Code Online (Sandbox Code Playgroud)
并childViewControllerWithId定义为:
extension UIViewController {
func childViewControllerWithId(rid:String) -> UIViewController? {
// check immediate child controllers
for vc in self.childViewControllers as! [UIViewController] {
if vc.restorationIdentifier == rid { return vc }
}
// check nested controllers
for vc in self.childViewControllers as! [UIViewController] {
if let vc = vc.childViewControllerWithId(rid) {
return vc
}
}
assert(false, "check your assumptions")
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
请注意find,如果需要,您可以根据类型进行其他变体。另请注意,以上要求您在 Storyboard 文件中定义恢复 ID。如果您没有相同视图控制器的重复实例,那么使用类型会更容易。
并且要说明什么是显而易见的,您不需要实现 prepareForSegue,也不需要使用延迟加载,您只需要调用find(...).
| 归档时间: |
|
| 查看次数: |
61376 次 |
| 最近记录: |