【问题标题】:ParentViewController is becoming nil , dont know where and howParentViewController 正在变成 nil ,不知道在哪里以及如何
【发布时间】:2014-03-27 23:13:15
【问题描述】:

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

它包含 4 个视图控制器

-MainViewController
-SettingsViewController 
-RulesViewController

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

@implementation ContainerViewController
{
     UIViewController * currentSubViewController;
}

所有三个 viewController 都是从 .nib 创建的

  • 主页有“设置”和“规则”两个按钮
  • 设置有 2 个按钮“主要”和“规则”
  • 规则有 2 个按钮“主要”和“设置”

启动时:

currentSubViewController 被设置为 MainViewController 的一个实例,然后

[container addChildViewController: currentSubViewController]

使容器成为 currentSubViewController 的父级。

主页显示没有任何问题

开机后按“设置按钮”

MainViweController 中的 IBAction 被调用

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

然后调用ContainerViewController中的showViewControllerWithName

- (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
}

SettingsViewController 出现

SettingsViewController上按下“主”按钮

SettingsMainController 中的IBACtion 被调用

 - (IBAction)onMain:(id)sender {
    if ([self parentViewController]) { // parentViewController is nil here
        [(ContainerViewController*)[self parentViewController] showViewControllerWithName:@"root"];

    }
 }

但 ParentViewController 在这里是 nil ,因此没有显示任何内容。 SettingsViewController 是上一步中函数调用showViewControllerWithName 中的toVC。

showViewControllerWithName()OnMain() 之间的某个位置,parentViewController 被设置为 nil。我一直检查到 viewDidAppear 并且 parentViewController 直到那时才为零。

我的问题是

  1. parentViewController 在哪里设置为零?
  2. 要调试这个问题,我想知道在viewDidAppear 之后调用了哪些其他内部函数
  3. 使用工厂类创建新的 UIViewController 是否会产生问题?
  4. 是否正在创建实例并且显示的实例不同?尽管我在调试器中检查了内存地址,但它是相同的

我无法解决这个问题。我尝试了一种非常 hacky 的方式,即使在 transitionFromViewController: 抛出异常说两个视图控制器都应该具有相同的父级时,我仍然跟踪派生类中的父级。

我现在被困在这个问题上将近两天了。非常感谢您的帮助。

【问题讨论】:

    标签: ios objective-c uicontainerview


    【解决方案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 有了父母。

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

    【讨论】:

    • 因为您可能在动画的完成块尚未完成时访问/检查父级。
    【解决方案2】:

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

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

    事实证明,我的方法名称不是很有创意,并且我覆盖了 UIViewController 方法。我所要做的就是重命名它,然后我就重新开始工作了。这花了我很长时间才找到!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2011-11-11
      • 1970-01-01
      • 2022-06-18
      • 1970-01-01
      相关资源
      最近更新 更多