Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 自定义容器视图控制器_Iphone_Objective C_Xcode_Ios6 - Fatal编程技术网

Iphone 自定义容器视图控制器

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

我正在使用容器API创建自定义容器视图控制器

在ViewDidLoad中创建父视图控制器加载父视图,并设置子视图控制器:

[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
调用一次。什么时候