在2011年WWDC会话102,苹果推出视图控制器遏制,这是创建定制的视图控制器容器的能力,类似于UITabBarController,UINavigationController和类似物.
我多次看过这些例子.有一系列与这种模式相关的方法,但有点难以弄清楚它们.我将在这里发布我认为正在发生的事情,看看社区是否会确认或否定我的怀疑.
场景1:从无父节点移动到新的父视图控制器
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)
前两行必须按给定的顺序发生,还是可以反转?
场景2:从父视图控制器移动到没有父视图控制器
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Run Code Online (Sandbox Code Playgroud)
还有必要打电话[vc didMoveToParentViewController:nil]吗?会话102中的示例在这种情况下没有这样做,但我不知道这是否是遗漏.
场景3:从一个父视图控制器移动到另一个父视图控制器
这可能以下列方式发生,因为将封装每个父视图控制器中的逻辑.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Run Code Online (Sandbox Code Playgroud)
问题
我的主要问题是:一般来说,视图控制器包含应该如何工作?上面给出的机制是否正确?
是否有必要在打电话willMoveToParentViewController前打电话addChildViewController?这对我来说似乎是合乎逻辑的顺序,但它是否是必要的?
打电话didMoveToParentViewController:nil后有必要打电话removeFromParentViewController吗?
我在使用动画交换rootViewControllers方面遇到了一些麻烦.这是我正在使用的代码:
[UIView transitionWithView:self.window duration:0.8 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{
self.window.rootViewController = self.navigationController;
} completion:nil];
Run Code Online (Sandbox Code Playgroud)
除了在动画之前,屏幕变成黑色然后动画发生之外,它有点工作.看起来原始的rootViewController在动画之前就被删除了.有任何想法吗?
我正在构建一个使用多种类型屏幕的应用程序 - 所有这些都保证了自己的自定义视图控制器.我成功视图控制器,并通过重新分配的主要及其相关视图之间切换window的rootViewController,在我的应用程序代理类似下面的方法:
- (void)changeRootViewController:(NSString *)controllerName
{
if (controllerName == @"book") {
rootViewController = (UIViewController *)[[BookViewController alloc] init];
[self.window setRootViewController:rootViewController];
} else if (controllerName == @"something_else") {
// Use a different VC as roowViewController
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我这样做的方式似乎不是最好的做法.我也不想使用a UINavigationController或a UITabBarController作为rootViewController.这是否是这样做的错误方式,如果是这样,我应该如何以不同的方式接近它?
我以为这会被覆盖在某个地方,但是(我觉得好像)我用Google搜索了它,找了相关的问题等等.抱歉,如果我错过了什么!
我有UIViewControllersA和B,他们被分配AppDelegate.我需要对它们进行过渡.如何在不重新分配和更换的情况下过境UIViews?这段代码来自我的UIBarButtonItemin UINavigationController:
[UIView transitionFromView:self.view //UIViewController A
toView:appDelegate.secondViewController.view //UIViewController B
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
Run Code Online (Sandbox Code Playgroud)
这个方法取代UIViews了我UIViewControllers,我可以将它们转回,或者只是不知道该怎么做.你能告诉我怎么做吗?
objective-c uiviewcontroller uiview uiviewanimationtransition ios