这两种方法都将视图添加为父视图的子视图,视图可以接收事件。何时使用哪一个?
答案 0 :(得分:21)
这完全取决于您希望如何管理新的子视图。如果您希望新的子视图由当前视图的视图控制器管理(例如,您添加的内容很简单,例如几个UILabel
个对象),则只需调用addSubview
即可。另一方面,如果新的子视图有自己的视图控制器(即它是足够复杂的视图集合,具有丰富的功能,您希望用自己的控制器封装所有这些复杂性来管理这个新子视图所做的一切)然后您调用addChildViewController
添加新的视图控制器,但也请调用addSubview
。
所以,请注意addChildViewController
本身对视图没有任何作用。您通常会立即使用添加其视图的调用来跟踪它,例如这是来自适用于iOS的View Controller编程指南的Implementing a Custom Container View Controller部分的一个略微澄清的示例:
[self addChildViewController:childViewController]; // add subview's view controller
childViewController.view.frame = ... // specify where you want the new subview
[self.view addSubview:childViewController.view]; // now you can add the child view controller's view
[childViewController didMoveToParentViewController:self]; // now tell the child view controller that the adding of it and its views is all done
所以,这不是addSubview
vs addChildViewController
的问题,而是addSubview
vs addChildViewController
+ addSubview
的问题。如果您致电addChildViewController
,那么您的目的就是在某个时候调用addSubview
查看其内容。
坦率地说,addSubview
与addChildViewController
+ addSubview
的问题很少是我们对此的看法。更合乎逻辑的思考方式是确定这个新视图是否有自己的视图控制器。如果是,则执行addChildViewController
调用序列。如果没有,您只需拨打addSubview
。
有关视图控制器包含的详细介绍(例如,该API的基本原理,保持视图层次结构与视图控制器层次结构同步的重要性等),请参阅WWDC 2011视频Implementing UIViewController Containment。
答案 1 :(得分:10)
他们非常不同。 addChildViewController将视图控制器与父容器视图控制器相关联,而addSubview将视图添加到要添加到的视图的视图层次结构中。在前一种情况下,新的子视图控制器将负责在事件是其父级的选定视图控制器时处理事件。想象一下标签栏控制器 - 每个标签都有自己的关联"孩子"视图控制器在父选项卡栏控制器的内容区域中显示其视图,并在选项卡栏中选择其相应选项卡时处理该视图中的任何用户交互。只有在拥有自定义容器视图并且想要将新视图控制器添加到其childViewControllers属性时,才应使用addChildViewController。如果您只想将新视图添加到可以接收事件的视图层次结构中,这听起来就像是这样,addSubview是可行的方法。 "Implementing a Container View Controller" section explains what addChildViewController is for.
答案 2 :(得分:2)
addChildViewController 是 UIViewController 类中的方法, addSubview 位于 UIView 类
中两者都有完全不同的行为。
addChildViewController 只是将视图控制器放在当前视图控制器的前面。您必须管理控制器的流程。此方法仅用于通过自定义容器视图控制器的实现来调用。
addSubview 将另一个视图作为子视图添加到该对象的视图中。
答案 3 :(得分:2)
知道MVC意味着模型 - 视图 - 控制器:
如果您只想添加视图,请使用addSubview
。例如添加标签,按钮。
但是,如果您打算广告查看 + 控制器,则必须使用addChildViewController
添加其控制器并且{{em>} 1}}添加视图。例如添加另一个viewController,tableViewController。
另外:
有两类事件被转发到子视图控制器:
1-外观方法:
addSubView
2-轮换方法:
- viewWillAppear:
- viewDidAppear:
- viewWillDisappear:
- viewDidDisappear:
如果你不这样做,你会遇到问题的一个例子是here
有关详情,我强烈建议查看有关this问题的答案。
答案 4 :(得分:1)
可从iOS 5,addChildViewController:
- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
方法允许您将任何视图控制器作为子项添加到其他视图控制器,但首先它从childController中删除任何父项,然后将其作为子视图控制器添加到指定的控制器。
子控制器只是UIViewController
的一个实例,因此它将提供视图控制器的功能(即它将接收-(void)viewWillAppear
, - (void)viewWillDisappear
等事件,如正常UIViewController
确实如此。
另一方面
- (void)addSubview:(UIView *)view;
addSubview:
会在任何其他视图上添加任何视图subview
。
这不是选择使用哪个而不是它是要求使用特定方法的类型。
For Instance -
如果你有UIViewController
的实例,肯定会使用addChildViewController:
(也可以使用presentModalViewController
,pushViewController
),如果你有UIView
的实例1}}绝对必须使用addSubview
。
注意:您还可以将视图控制器的视图添加为任何其他视图的子视图。
答案 5 :(得分:0)
基于一些测试,我发现:如果未将子视图控制器添加到父视图控制器(假设父视图控制器位于根视图控制器下),则只有子视图控制器的视图被添加到父视图控制器的视图中,然后:
- viewWillAppear:
,- viewWillLayoutSubviews
等。但是
- willRotateToInterfaceOrientation:duration:
但是我现在无法给出消息列表。
答案 6 :(得分:0)
addChildViewController用于防止添加的子视图控制器释放,换句话说,父视图控制器将保持对子视图控制器的强引用。