查看加载方法未触发

时间:2010-03-22 00:05:05

标签: iphone cocoa-touch uiview uiviewcontroller

我正在加载这样的视图:

if(commentSubmissionView == nil){
    commentSubmissionView = [[CommentSubmissionController alloc] initWithNibName:@"CommentSubmissionView" bundle:nil];  
}
[self.view addSubview:commentSubmissionView.view];

在commentSubmissionView中的viewDidLoad和viewWillAppear不会触发。还有什么我需要做的吗?

3 个答案:

答案 0 :(得分:1)

如果您使用的是addSubview:,那么您还需要使用bringSubviewToFront:,如下所示:

if(commentSubmissionView == nil){
    commentSubmissionView = [[CommentSubmissionController alloc] initWithNibName:@"CommentSubmissionView" bundle:nil];  
}
[self.view addSubview:commentSubmissionView.view];
[self.view bringSubviewToFront:commentSubmissionView.view];

答案 1 :(得分:1)

viewWillAppear:的文档并不完全清楚,但请看一下它的内容:

  

响应a调用此方法   视图直接添加或   间接到一个窗口。您添加视图   通过使用直接到窗口   addSubview:将它们添加到的方法   窗口的视图层次结构。你也可以   以多种方式间接添加视图,   包括把它推到一个   导航堆栈或通过呈现它   模态地(使用   presentModalViewController:动画:   方法)。之前调用此方法   视图实际上已添加到   窗口和任何动画之前   构造

只有在以下情况下才会调用viewDidAppear:viewWillAppear:方法:

  1. 将它们添加到窗口(添加到视图不计算 - 它必须是一个窗口)
  2. 使用pushViewController:presentModalViewController:animated:或在标签控制器中切换标签或Apple提供的视图控制器为您添加视图控制器及其视图的任何其他情况。
  3. 在您要将视图添加到另一个视图的情况下,您必须自己在视图控制器上调用viewWillAppear:viewDidAppear:,否则它们将不会发生。

    我不知道为什么viewDidLoad最初没有被你调用过。除非发生错误,否则在loadView之后将始终在控制器上首次调用view属性访问器时调用它。视图加载可能失败(您必须检查控制台日志)。

    由于addSubview:始终会添加到bringSubviewToFront:,因此您无需关注addSubview: addSubview:。同样,来自{{1}}

    的文档
      

    向接收者的子视图添加视图   所以它显示在兄弟姐妹之上。

答案 2 :(得分:0)

在UIViewController子类上调用

viewDidLoadviewWillAppearcommentSubmissionView看起来像UIView子类。正如Matt所提到的,您可能想要推送/呈现视图控制器而不是仅添加子视图。