Mar*_*ery 98 uiviewcontroller ios uicontainerview
我只是第一次踏入iOS开发阶段,而我必须要做的第一件事就是实现一个自定义的容器视图控制器 - 让我们调用它SideBarViewController- 交换出几个可能的子视图控制器中的哪一个显示,几乎完全像标准的标签栏控制器.(它几乎是一个标签栏控制器,但有一个可隐藏的侧面菜单而不是标签栏.)
根据Apple文档中的说明,addChildViewController每当我将一个子ViewController添加到我的容器时,我都会调用它.用于交换当前子视图控制器的代码如下所示SideBarViewController:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Run Code Online (Sandbox Code Playgroud)
然后我开始试图弄清楚addChildViewController这里有什么,我意识到我不知道.除了ViewController在.childViewControllers阵列中粘贴新内容外,它似乎对任何东西都没有影响.从孩子控制器的视图到我在故事板上设置的子控制器的操作和出口仍然可以正常工作,即使我从不打电话addChildViewController,我无法想象它还能影响到什么.
事实上,如果我重写我的代码不打电话addChildViewController,而是看起来像这样......
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
Run Code Online (Sandbox Code Playgroud)
...然后我的应用程序仍然完美,据我所知!
Apple文档没有详细addChildViewController说明我们应该称之为什么或为什么.目前,该方法所做的相关描述的全部范围或其在" UIViewController类参考"中应用的原因是:
将给定的视图控制器添加为子级....此方法仅用于通过自定义容器视图控制器的实现来调用.如果重写此方法,则必须在实现中调用super.
同一页面上也有这一段:
在将子视图的根视图添加到视图层次结构之前,容器视图控制器必须将子视图控制器与其自身关联.这允许iOS正确地将事件路由到子视图控制器以及这些控制器管理的视图.同样,在从视图层次结构中删除子视图的根视图后,它应该断开该子视图控制器与其自身的连接.要建立或断开这些关联,容器会调用基类定义的特定方法.这些方法不是由容器类的客户端调用的; 它们仅由容器的实现使用,以提供预期的包含行为.
以下是您可能需要调用的基本方法:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
但它没有提供任何关于它所谈论的"事件"或"预期遏制行为"的线索,或者为什么(甚至何时)称这些方法是"必不可少的".
Apple文档的"自定义容器视图控制器"部分中的自定义容器视图控制器的示例都调用此方法,因此我认为除了将子ViewController弹出到数组之外,它还有一些重要的用途,但我无法想象出于什么目的.这种方法做了什么,为什么要调用它?
Hej*_*azi 108
我认为一个例子胜过千言万语.
我正在开发一个图书馆应用程序,并希望显示一个很好的记事本视图,当用户想要添加注释时出现.

在尝试了一些解决方案后,我最终发明了自己的自定义解决方案来显示记事本.因此,当我想要显示记事本时,我创建了一个新实例NotepadViewController并将其根视图作为子视图添加到主视图中.到现在为止还挺好.
然后我注意到,在横向模式下,记事本图像部分隐藏在键盘下方.

所以我想改变记事本图像并将其向上移动.为此,我在willAnimateRotationToInterfaceOrientation:duration:方法中编写了正确的代码,但是当我运行应用程序时没有发生任何事情!在调试之后,我注意到UIViewController实际上没有调用任何旋转方法NotepadViewController.仅调用主视图控制器中的那些方法.
为了解决这个问题,我需要NotepadViewController在主视图控制器中调用所有方法.这将很快使事情变得复杂,并在应用程序中的不相关组件之间创建额外的依赖关系.
那是在过去,在引入子视图控制器的概念之前.但现在,您只需要到 addChildViewController主视图控制器,一切都将按预期工作,无需任何手动工作.
编辑: 有两类事件转发到子视图控制器:
1-外观方法:
- viewWillAppear:
- viewDidAppear:
- viewWillDisappear:
- viewDidDisappear:
Run Code Online (Sandbox Code Playgroud)
2-轮换方法:
- willRotateToInterfaceOrientation:duration:
- willAnimateRotationToInterfaceOrientation:duration:
- didRotateFromInterfaceOrientation:
Run Code Online (Sandbox Code Playgroud)
您还可以通过覆盖shouldAutomaticallyForwardRotationMethods和控制自动转发的事件类别shouldAutomaticallyForwardAppearanceMethods.
nev*_*ing 93
我也想知道这个问题.我观看了WWDC 2011视频的第102场会议, View View先生,Bruce D. Nilo先生说:
viewWillAppear:,viewDidAppear:等等与此无关addChildViewController:.所有这一切addChildViewController:就是说"这个视图控制器是那个视图控制器的孩子",它与视图外观无关.当调用进入和退出窗口层次结构时,它们被调用时会被关联.
所以看来这个电话addChildViewController:做的很少.呼叫的副作用是重要的部分.他们来自parentViewController和childViewControllers人际关系.以下是我所知道的一些副作用:
transitionFromViewController:toViewController:…两个VC需要具有相同父级的情况下navigationController,tabBarController等属性-[UIViewController addChildViewController:]只在视图控制器数组中添加传入的视图控制器,而viewController(父级)希望保持对它的引用.您应该通过将它们添加为另一个视图的子视图(例如,parentViewController的视图)来自己在屏幕上添加这些viewController的视图.Interface Builder中还有一个便利对象,可以在Storyboard中使用childrenViewControllers.
以前,为了保留您使用其视图的其他viewControllers的引用,您必须在@properties中保留它们的手动引用.拥有类似的内置属性childViewControllers并因此parentViewController是管理此类交互和构建组合的viewControllers的便捷方式,例如您在iPad应用程序上找到的UISplitViewController.
此外,childrenViewControllers还会自动接收父接收的所有系统事件:-viewWillAppear,-viewWillDisappear等.以前您应该在"childrenViewControllers"上手动调用此方法.
而已.
| 归档时间: |
|
| 查看次数: |
43174 次 |
| 最近记录: |