UIViewController类别不在viewDidLoad上工作

时间:2014-04-25 16:17:18

标签: ios objective-c uiviewcontroller

我正在使用自定义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
                      }];

}

2 个答案:

答案 0 :(得分:0)

这段代码(parent = [parent parentViewController])设置parent等于self.parentViewController。如果self在调用它时没有父视图控制器,它将按预期返回nil

更广泛地说,我不确定您要使用此代码完成什么,或者为什么需要使用类别。似乎这种行为在UIViewController子类中更有意义。

答案 1 :(得分:0)

在调用viewDidLoad时,视图控制器尚未添加到视图控制器层次结构中,因此它没有父视图控制器,因此您的函数按预期返回nil。