ParentViewController变得零,不知道在哪里以及如何

时间:2014-03-27 23:13:16

标签: ios objective-c uicontainerview

我正在尝试创建一个应用程序,第一步是创建viewControllers并链接它们。我知道我可以使用故事板和sueges做到这一点,但我想用旧式的方式做 - 通过编码即

它包含4个视图控制器

-MainViewController
-SettingsViewController 
-RulesViewController

使用ContainerViewController(第4个viewController)(我写的自定义容器)管理三个视图控制器。 currentSubViewController跟踪当前显示的viewController

@implementation ContainerViewController
{
     UIViewController * currentSubViewController;
}

所有三个viewControllers都是从.nib

创建的
  • 主页面有2个按钮“设置”和“规则”
  • 设置有2个按钮“Main”和“Rules”
  • 规则有2个按钮“Main”和“Settings”

启动时:

currentSubViewController设置为MainViewController的实例,然后

[container addChildViewController: currentSubViewController]

使容器成为currentSubViewController的父级。

主页面显示没有任何问题

按下“设置按钮”后启动

MainViweController中的IBAction称为

- (IBAction)onSettings:(id)sender {
        if ([self parentViewController]) {
             [(ContainerViewController*)[self parentViewController showViewControllerWithName:@"settings"];
}
}

然后showViewControllerWithName的{​​{1}}被称为

ContainerViewController

SettingsViewController 显示

开启按- (void) showViewControllerWithName:(NSString*)vctype { UIViewController * toVC = [ViewControllerFactory getViewControllerOfType:vctype]; // viewController factory returns the appropriate viewController i.e either MainViewController or SettingsViewController or RulesViewController toVC.view.frame = containerView.bounds; toVC.view.autoresizingMask = containerView.autoresizingMask; [currentSubViewController willMoveToParentViewController:nil]; [self addChildViewController:toVC]; [self transitionFromViewController:currentSubViewController toViewController:toVC duration:1.0 options:UIViewAnimationOptionCurveLinear animations:^{} completion:^(BOOL finished){ [currentSubViewController removeFromParentViewController]; [toVC didMoveToParentViewController:self]; }]; currentSubViewController = toVC; // I checked here toVC has a parentViewController set to ContainerViewController }

上的“主要”按钮

在SettingsMainController中调用IBACtion

SettingsViewController

但是ParentViewController在这里是零,因此没有显示任何内容。 SettingsViewController是来自上一步中函数调用 - (IBAction)onMain:(id)sender { if ([self parentViewController]) { // parentViewController is nil here [(ContainerViewController*)[self parentViewController] showViewControllerWithName:@"root"]; } } 的toVC。

介于showViewControllerWithNameshowViewControllerWithName()之间,OnMain()设置为parentViewController。直到那时我检查了viewDidAppear并且parentViewController不是nil。

我的问题是

  1. nil在哪里设置为nil?
  2. 要调试此问题,我想知道在parentViewController
  3. 之后调用了哪些其他内部函数
  4. 是否正在使用工厂类创建新的UIViewControllers来创建问题?
  5. 正在创建实例并且实例显示不同?虽然我在调试器中检查了内存地址是否相同
  6. 我无法解决这个问题。我尝试了一种非常hacky的方式,即在那时我跟踪派生类中的父级,即使然后viewDidAppear抛出异常,说两个视图控制器应该具有相同的父级。

    我现在被困在这两天了。我真的很感激一些帮助。

2 个答案:

答案 0 :(得分:1)

好吧,我终于能够让它发挥作用了。让我再简洁地解释一下这个问题

- > ContainerViewController显示MainViewController,当您检查MainViewController.ParentController时,它实际上是ContainerViewController

- > ContainerViewController使用以下函数从MainViewController转换为SettingsViewController

  (void) showViewControllerWithName:(NSString*)vctype
  {
     UIViewController * toVC = [ViewControllerFactory getViewControllerOfType:vctype]; 
    toVC.view.frame = containerView.bounds;
    toVC.view.autoresizingMask = containerView.autoresizingMask;

    [currentSubViewController willMoveToParentViewController:nil];

    [self addChildViewController:toVC];

    [self transitionFromViewController:currentSubViewController
              toViewController:toVC duration:1.0 options:UIViewAnimationOptionCurveLinear animations:^{} completion:^(BOOL finished){
                  [currentSubViewController removeFromParentViewController];
                  [toVC didMoveToParentViewController:self];

              }];
    currentSubViewController = toVC;


}

- >转换后SettingsViewController.parentViewController为零

以下是修复:

           animations:^{} completion:^(BOOL finished){
                  [currentSubViewController removeFromParentViewController];
                  [toVC didMoveToParentViewController:self];

              }];

    currentSubViewController = toVC;

更改为

           animations:^{} completion:^(BOOL finished){

              }];
    [currentSubViewController removeFromParentViewController];
    [toVC didMoveToParentViewController:self];
    currentSubViewController = toVC;

现在SettingsViewController有父母。

好吧,如果有人能解释到底发生了什么,那就太棒了。

答案 1 :(得分:0)

我只是想在这里打电话。我有一个带有故事板的父/子布局设置,直到有一天工作......

原来我写了一个名为的实用工具方法: - (UIViewController *)addChildViewController:(UIViewController *)chidViewController

事实证明,我的方法名称并不是很有创意,而且我覆盖了一个UIViewController方法。我所要做的就是将其重命名,然后我重新开始营业。这花了很长时间才追查到了!