Iphone 自定义容器视图控制器
我正在使用容器API创建自定义容器视图控制器 在ViewDidLoad中创建父视图控制器加载父视图,并设置子视图控制器:Iphone 自定义容器视图控制器,iphone,objective-c,xcode,ios6,Iphone,Objective C,Xcode,Ios6,我正在使用容器API创建自定义容器视图控制器 在ViewDidLoad中创建父视图控制器加载父视图,并设置子视图控制器: [self addChildViewController:newA]; [self addChildViewController:newB]; [self addChildViewController:newC]; 现在,添加这些childVC后,我可以使用: [self transitionFromViewController:from
[self addChildViewController:newA];
[self addChildViewController:newB];
[self addChildViewController:newC];
现在,添加这些childVC后,我可以使用:
[self transitionFromViewController:from
toViewController:to
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:nil
completion:^(BOOL b){
[to didMoveToParentViewController:self];
[from.view removeFromSuperview];
[from removeFromParentViewController];
}];
我现在的问题是,我必须从父VC中删除当前的子VC以显示新的VC吗
completion:^(BOOL b){
[to didMoveToParentViewController:self];
[from.view removeFromSuperview];
[from removeFromParentViewController];
}
有没有一种方法可以让我保留这些childvc’并简单地执行滑动/按钮操作,然后在这些childvc’之间导航 因此您不需要手动从视图层次结构中删除视图控制器视图中的
。此方法在动画块完成后为您处理该问题。从该方法的文档中:
此方法将第二个视图控制器的视图添加到视图中
然后执行动画中定义的动画
块动画完成后,将删除第一个视图
视图层次结构中的控制器视图
不过,作为一个警告,动画块不能像代码示例中那样为NULL
(也就是说,您有nil
,而不是NULL
,这是没有意义的,因为animations
参数是块,而不是Objective-C对象)
更新:根据您的实现,viewDidLoad
如果该视图的内存被清除,可能会被重复调用。例如,UITabBarController
,通常只在将VC添加到选项卡栏时调用viewDidLoad,然后只调用viewWill/DidDisplay。类似地,当您弹出视图控制器时,UINavigationController
不会调用viewDidLoad
,因为它一直在其导航堆栈中维护它,但如果您弹出VC,然后将其推回(通常)时,它会调用viewDidLoad
。如果没有获得所需的行为,可以在容器实现中对该方法进行子类化
**注意我正在从您的问题中删除iphone-sdk-4.0标记,因为包容API直到5.0才可用,所以您不需要手动从视图层次结构中删除视图控制器视图中的。此方法在动画块完成后为您处理该问题。从该方法的文档中:
此方法将第二个视图控制器的视图添加到视图中
然后执行动画中定义的动画
块动画完成后,将删除第一个视图
视图层次结构中的控制器视图
不过,作为一个警告,动画块不能像代码示例中那样为NULL
(也就是说,您有nil
,而不是NULL
,这是没有意义的,因为animations
参数是块,而不是Objective-C对象)
更新:根据您的实现,viewDidLoad
如果该视图的内存被清除,可能会被重复调用。例如,UITabBarController
,通常只在将VC添加到选项卡栏时调用viewDidLoad,然后只调用viewWill/DidDisplay。类似地,当您弹出视图控制器时,UINavigationController
不会调用viewDidLoad
,因为它一直在其导航堆栈中维护它,但如果您弹出VC,然后将其推回(通常)时,它会调用viewDidLoad
。如果没有获得所需的行为,可以在容器实现中对该方法进行子类化
**注意我正在从您的问题中删除iphone-sdk-4.0标记,因为遏制API直到5.0才可用我应该写得更好(我会编辑)我不一定关心删除…我的问题更多地围绕着是否有必要删除它,我是否可以在内存中进行维护,以便在不必反复加载的情况下进行转换?正如我所说,此方法将自动处理在动画完成后从超级视图中删除第一个视图。查看我的编辑了解更多细节。我应该写得更好(我会编辑)我不一定关心删除…我的问题更多地围绕着是否有必要删除它,我是否可以保留在内存中,这样我就可以过渡,而不必像我说的那样反复加载,此方法将在动画完成后自动处理从超级视图中删除第一个视图的操作。有关更多详细信息,请参阅我的编辑。我知道您现在已经掌握了自定义容器视图控制器,但为了澄清这个老问题,请不要忘记调用[newA didMoveToParentViewController:self]
,每次调用一次addChildViewController
。添加时,在完成时调用didMove…
(不仅仅是在转换时)。删除时,请在执行之前调用将移动…:nil
。请参见调用didMoveToParentViewController
和willMoveToParentViewController
是执行添加ChildViewController
和从父视图控制器中移除时的函数,当您从ViewController执行转换时,就不会了。
。再次感谢您提供的大量帮助…您在本周末的许多场合都不遗余力地帮助了我…因此,根据您所说的,我缺少将移动…:在完成
块中为零
?您通常会这样做willMove…:nil
在您尝试删除子对象之前,必须减少该删除的动画。请参见中的代码清单14-3。不过,您将在完成块中对新添加的子项执行didMove…
。我知道您现在已经掌握了自定义容器视图控制器,但为了澄清这个老问题,请不要忘记调用[newA didMoveToParentViewController:self]
,每个addChildViewController
调用一次。什么时候