我正在使用自定义rootViewController,并使用以下代码从任何UIViewController访问它
@implementation UIViewController(CustomRootVC)
- (CustomRootVC*)customViewController
{
UIViewController *parent = self;
Class customClass = [CustomRootVC class];
while ( nil != (parent = [parent parentViewController]) && ![parent customClass] )
{
}
return (id)parent;
}
@end
如果我在viewDidLoad上调用self.customViewController,我会得到nil。如果我在willAppear上调用它,我会得到我期望的引用。
我猜这与我将视图控制器添加到视图控制器容器的顺序有关(即在将视图控制器添加到customViewController之前调用viewDidLoad,因此它不是父视图),但是我看不出任何明显的东西。我按如下方式添加视图控制器:
- (void)addViewController:(UIViewController*)controller toWrapper:(PLSliderView*)wrapper{
[self addChildViewController:controller];
[self addView:controller.view ToWrapper:wrapper];
[self.viewControllers addObject:controller];
[controller didMoveToParentViewController:self];
}
特别是,问题似乎是添加了一个新的视图控制器和视图,如下所示:
- (void)replaceTopOfStackWithViewController:(UIViewController *)newController animated: (BOOL)animated {
UIViewController *oldController = self.currentController;
[self addChildViewController:newController];
[self transitionFromViewController:oldController
toViewController:newController
duration:1.0
options:UIViewAnimationOptionTransitionCrossDissolve
animations:nil
completion:^(BOOL finished) {
[self.rightViewController didMoveToParentViewController:self];
[self removeViewController:oldController];
[self queryDimensions:@"REPLACE"];
[self.view setUserInteractionEnabled:YES];
self.currentController = newController
}];
}
答案 0 :(得分:0)
这段代码(parent = [parent parentViewController])
设置parent
等于self.parentViewController
。如果self
在调用它时没有父视图控制器,它将按预期返回nil
。
更广泛地说,我不确定您要使用此代码完成什么,或者为什么需要使用类别。似乎这种行为在UIViewController
子类中更有意义。
答案 1 :(得分:0)
在调用viewDidLoad时,视图控制器尚未添加到视图控制器层次结构中,因此它没有父视图控制器,因此您的函数按预期返回nil。