1

我有一个带有子视图的根视图控制器,作为子视图控制器视图的包装器。基本思想是我的根控制器有一个左右视图控制器,它们都出现在屏幕上(类似于 splitviewcontroller)。加载时会在根视图控制器上弹出一个模式视图并询问详细信息。模态视图然后联系服务器,并在得到响应后关闭。然后根控制器使用以下代码添加子视图控制器:

[self addViewController:self.leftViewController];
[self addViewController:self.rightViewController];

[self addView:self.rightViewController.view ToWrapper:self.rightViewWrapper];
[self addView:self.leftViewController.view ToWrapper:self.leftViewWrapper];

添加视图控制器在哪里:

[self addChildViewController:controller];
[controller didMoveToParentViewController:self];

而 addViewToWrapper 只是将视图控制器的视图添加到 rootViewController 的相关子视图中,如下所示:

[[viewWrapper.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
newSubview.frame = viewWrapper.contentView.bounds;
newSubview.autoresizingMask = UIViewAutoresizingFlexibleHeight |    UIViewAutoresizingFlexibleWidth;
[viewWrapper.contentView addSubview:newSubview];

99% 的时间都可以正常工作。两个视图都会立即出现,并且 viewWillAppear 会在两个子控制器中触发。但是,有时屏幕会在短时间内保持白色,并且 viewWillAppear 不会在右侧视图控制器(编辑:和左侧)中触发。所有其他视图生命周期方法都会触发,只是不会触发 viewWillAppear。

不幸的是,我不能为整个类提供代码,因为它很复杂并且是专有的。但是,对于这种间歇性行为,此描述中是否有任何线索?

4

1 回答 1

2

对此的一些想法:

看起来您的遏制方法没有被正确调用。对于每个 viewController,它们应该如下所示:

    [self addChildViewController:controller];
    [self.view addSubview:controller.view]; 
    [controller didMoveToParentViewController:self];

视图应该在addChilddidMove调用之间添加到父视图中。

据我所知,一次只能进行一次演示或解雇。即,如果您试图在模式被解除的同时呈现(添加)您的子视图控制器,您将在控制台日志中看到一个错误,并且您的“添加”操作将不会发生。

我的建议是在模态视图控制器上创建一个委托协议。并在完成块中dismissViewControllerAnimated:completion:,调用您的委托方法:

[self dismissViewControllerAnimated:YES completion:^{
   if ([weakSelf.delegate respondsToSelector:@selector(settingsViewControllerDidDismiss:)])
   {
       [weakSelf.delegate settingsViewControllerDidDismiss:self];
   }
}];

在您的 rootViewController 中,您将开始将其子项添加到该方法中settingsViewControllerDidDismiss或您决定调用该方法的任何内容中。关键是“添加”操作在解雇操作之后开始。

希望这可以帮助。

于 2014-04-23T18:16:53.127 回答