在不使用transitionFromViewController时我必须发送的UIViewController包含消息的正确顺序是什么?

Kru*_*lur 10 cocoa-touch uiviewcontroller xamarin.ios ios5

在实现UIViewController包含时,在将一个子控制器与另一个子控制器交换时,我必须发送以下消息的正确顺序是什么?

它是如下,还是我的订单不正确?我错过了消息吗?

  • 将新的子控制器添加到当前控制器addChildViewController:
  • 将新子控制器的子视图添加到当前控制器的视图中addSubview:
  • 运行从旧视图到新视图的一些奇特过渡.
  • 通知已添加到另一个控制器的新子控制器 didMoveToParentViewController:
  • 从其superview中删除以前控制器的视图removeFromSuperview::
  • 从其父级删除以前的子控制器removeFromParentViewController::

编辑: 我必须注意,上面只是你不使用UIViewController的转换方法而是想手动添加新视图的问题.

Kru*_*lur 15

好吧,想通了.这完全在文档中,但我发现它很好隐藏.我会把它分成三个案例,因为我认为它可能对其他人有所帮助.为什么我这么难做而不是使用[UIViewController transitionFromViewController:toViewController:duration:options:animations:completion]?答案是,如果已有视图控制器,则只能使用转换方法.如果要从"无控制器"转换到某个控制器,反之亦然,则上述方法将引发异常.

情况1:两个控制器都是相同的 - 包括两个都是空的

  • 什么都不做,我们已经拥有了我们想要的屏幕.:-)

情况2:旧控制器为NULL,新控制器不为NULL.只需添加新控制器即可.

  • 发送addChildViewController到新控制器 - 这将触发隐式willMoveToParentViewController
  • 使新视图成为您想要的大小
  • 将子控制器的视图插入此控制器的视图层次结构中: addSubview
  • 通过发送它通知子控制器它是作为子项添加的: didMoveToParentViewController

情况3:旧控制器不为NULL且新控制器不为NULL.在控制器之间运行转换.

  • 调整新视图的框架/边界.
  • 发送addChildViewController到新控制器 - 这将触发隐式willMoveToParentViewController
  • 发送旧控制器willMoveToParentViewController并将其作为新父控制器传递给nil
  • 将新子视图添加到视图中
  • 使用UIView's动画在旧视图和新视图之间运行自定义过渡.
  • 在动画结束委托中,发送didMoveToParentViewController到新控制器.
  • 从超级视图中删除旧控制器的视图.
  • 发送removeFromParentViewController到旧控制器 - 这将触发隐式didMoveToParentViewController