我们说我有RestaurantViewController
。我想直接嵌入3个视图控制器来填充这个父级。 (当然不包括导航栏。)
在导航栏中,会有一个按钮 当我点击此按钮时,3个VC的可见性将循环。 (没有动画,只是隐藏/显示)。
当我点按按钮时,我希望3个孩子尊重事件viewWillAppear
,viewWillDisappear
等等...更改hidden
属性会调用这些吗?
我该怎么做?
我的理论是创建3个容器并将它们添加到RestaurantViewController.view
,然后在点击按钮时为它们设置隐藏。我不确定这是不是"对"方式。
答案 0 :(得分:3)
如果您希望每个孩子拥有它自己的屏幕区域,那么使用3个不同容器并且每个孩子都有不同的孩子可以正常工作。
不,每次子的隐藏标志从true切换为false时,都不会调用viewWillAppear / viewWillDisappear。正如Tj3n所说,只有在从屏幕上删除子视图控制器的视图然后重新添加时才会调用它。
如果您有一个单独的容器视图,每次按下按钮时都要用其他子视图控制器替换,那么您希望在UIViewController中使用父/子视图控制器方法。请参阅"实现容器视图控制器"在UIViewController上的Xcode文档中。
您可以使用embed segue将起始子视图控制器添加到容器中,并使用addChildViewController
添加其他控件。
还有一些方法可以让您从一个孩子过渡到另一个孩子,例如transitionFromViewController:toViewController:duration:options:animations:completion:
。这是一种非常强大的方法,可让您将子视图控制器与各种过渡效果交换。这是用户按下按钮交换视图控制器时触发的方法。
答案 1 :(得分:0)
您可以将3个UIViewControllers添加到主视图控制器,但它们都不会调用viewWillAppear。 您可以在每个视图中添加标记值,而不是使用隐藏的属性:
-(void)changeViews:(int) index {
if (lastDisplayedView == 1) {
// code you wanted in viewWillDisappear for view 1
} else if (lastDisplayedView == 2) {
// code you wanted in viewWillDisappear for view 2
} else if (lastDisplayedView == 3) {
// code you wanted in viewWillDisappear for view 3
}
UIView *viewToRemove = (UIView *)[self.view viewWithTag:lastDisplayedView];
[viewToRemove removeFromSuperview];
UIView *viewToShow = (UIView *)[self.view viewWithTag:index];
[self.view addSubview:viewToShow];
lastDisplayedView = index;
// code you need to do when view appears
}