这两种方法都将视图添加为< strong>父视图的子代,视图可以接收< strong>事件。何时使用哪个方法?
这两种方法都将视图添加为< strong>父视图的子代,视图可以接收< strong>事件。何时使用哪个方法?
UILabel
对象),则只需调用addSubview
。另一方面,如果新的子视图有自己的视图控制器(即它是一个包含复杂集合视图和丰富功能的足够复杂的子视图,你希望使用自己的控制器来封装所有这些复杂性以管理该新子视图所做的一切),那么你需要调用addChildViewController
来添加新的视图控制器,但也要调用addSubview
。addChildViewController
本身不对视图进行任何操作。通常,你会立即跟随它并调用其视图,例如,在iOS的View Controller Programming Guide的实现自定义容器视图控制器部分中有一个稍微澄清的示例。[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
vs. addChildViewController
+addSubview
的问题。更合理的思考方式是确定这个新视图是否有自己的视图控制器。如果有,您就执行 addChildViewController
的一系列调用。如果没有,您只需调用 addSubview
。parentViewController
它有一个子视图。为什么还要告诉子视图您有一个父视图?当添加子视图时,我们只需执行self.addSubView(subview)
。我们不需要添加额外的subview.didGerAddedToSuperView
。 - mfaaniwillMoveToParentViewController
(由addChildViewController
调用)和didMoveToParentViewController
(就像viewWillAppear
和viewDidAppear
)把整个过程框起来。 - RobaddChildViewController 是 UIViewController 类中的一个方法,而 addSubview 则是 UIView 类中的一个方法。
它们的行为完全不同。
addChildViewController 只是将一个视图控制器放在当前视图控制器的前面。您需要管理控制器的流程。此方法仅应由自定义容器视图控制器的实现调用。
addSubview 将另一个视图添加为该对象的子视图。
了解MVC的意思是指模型-视图-控制器:
如果您只想添加视图,则使用addSubview
命令。例如:添加标签、按钮等。
但是,如果您想要添加视图+控制器,那么您必须使用addChildViewController
来添加其控制器并且同时使用addSubView
来添加其视图。例如:添加另一个视图控制器、表格视图控制器等。
此外:
有两类事件会转发给子视图控制器:
1- 外观方法:
- viewWillAppear:
- viewDidAppear:
- viewWillDisappear:
- viewDidDisappear:
2-旋转方法:
- willRotateToInterfaceOrientation:duration:
- willAnimateRotationToInterfaceOrientation:duration:
- didRotateFromInterfaceOrientation:
根据一些测试,我发现:如果子视图控制器没有添加到父视图控制器(假设父视图控制器在根视图控制器下面),则只有子视图控制器的视图被添加到父视图控制器的视图中,那么:
- viewWillAppear:
,- viewWillLayoutSubviews
等。但是
- willRotateToInterfaceOrientation:duration:
我现在无法提供消息列表。
addChildViewController:
方法。- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
方法让您将任何视图控制器作为子控制器添加到其他视图控制器中,但首先它会从childController中删除任何父级,然后将其作为子视图控制器添加到指定的控制器中。
子控制器只是UIViewController
的一个实例,因此它将提供视图控制器的功能(例如,它将像普通的UIViewController
一样接收事件,如-(void)viewWillAppear
、-(void)viewWillDisappear
等)。
另一方面
- (void)addSubview:(UIView *)view;
addSubview:
会将任何视图作为subview
添加到其他视图上。
选择使用哪个方法并不重要,而是根据类型来决定使用特定的方法。
例如 -
如果您有一个UIViewController
的实例,那么您肯定会使用addChildViewController:
(也可以使用presentModalViewController
,pushViewController
),如果您有一个UIView
的实例,则绝对必须使用addSubview
。
注意:您还可以将视图控制器的视图添加为其他视图的子视图。
addChildViewController 用于防止添加的子视图控制器释放,换句话说,父视图控制器将持有子视图控制器的强引用。