4

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

它包含 4 个视图控制器

-MainViewController
-SettingsViewController 
-RulesViewController

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

@implementation ContainerViewController
{
     UIViewController * currentSubViewController;
}

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

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

启动时:

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

[container addChildViewController: currentSubViewController]

使容器成为 currentSubViewController 的父级。

并且主页显示没有任何问题

启动后按“设置按钮”

MainViweController 中的 IBAction 被调用

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

然后showViewControllerWithName ofContainerViewController被称为

- (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 在这里为零,因此没有显示任何内容。SettingsViewController 是来自上一步中的函数调用的 toVC showViewControllerWithName

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

我的问题是

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

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

我被困在这个问题上将近两天了。我真的很感激一些帮助。

4

2 回答 2

1

好吧,我终于能够让它工作了。让我再次简明扼要地解释一下这个问题

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

->ContainerViewController从使用以下函数转换MainViewControllerSettingsViewController

  (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有了父母。

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

于 2014-04-03T20:29:54.037 回答
0

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

原来我写了一个名为:-(UIViewController*)addChildViewController:(UIViewController*)chidViewController

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

于 2016-07-06T00:28:01.013 回答