2010-03-22 46 views
3

我加载一个观点是这样的:查看load方法不点火

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

的viewDidLoad和viewWillAppear中的commentSubmissionView不火。还有什么我需要做的吗?

回答

1

viewWillAppear:的文档并不完全清楚,但看看它说:

调用此方法是为了响应直接添加的 视图或将 间接添加到窗口。您可以直接使用 addSubview:方法将视图 添加到窗口的视图层次结构中,从而将视图 添加到窗口中。也可以间接地 添加的图在几个方面, 包括推到 导航堆栈或通过呈现它 模态(使用 presentModalViewController:动画: 方法)。在 之前调用此方法,该视图实际上已添加到 窗口中,并且在配置了任何动画 之前。

viewDidAppear:,如果你是viewWillAppear:方法才会被调用:

  1. 它们添加到一个窗口(添加到视图不计 - 它必须是一个窗口)
  2. 使用pushViewController:presentModalViewController:animated:或在选项卡控制器中切换选项卡或Apple提供的视图控制器为您添加视图控制器及其视图的任何其他情况。

在你的情况,你在哪里添加视图到另一个视图,您必须对视图调用viewWillAppear:viewDidAppear:控制器自己或他们将不会发生。

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

你不需要关注addSubview:bringSubviewToFront:因为addSubview:总是增加到前面。再次,从addSubview:

的文档添加一个视图到接收器的子视图 所以它的上面它的兄弟姐妹显示。

+0

谢谢。在#1中,你说“...添加到视图不会计数...”然而文档指出,“您可以直接使用addSubview:方法将视图添加到窗口中......”。由于我使用addSubview,该方法应该触发正确? – 4thSpace 2010-03-22 21:36:07

+0

addSubview:只会导致viewDidAppear:和viewWillAppear:如果您调用addSubview:在窗口(即[window addSubview:newView])上触发。由于您在视图上调用它(即[view addSubview:newView]),它将不起作用。我不知道为什么苹果有这样的区别,但他们有。 – 2010-03-25 05:42:50

1

如果你使用addSubview:,那么你还需要使用bringSubviewToFront:如下:

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

这将抛出此异常: 'NSInvalidArgumentException' 的,理由是: '*** - [UIView的makeKeyAndVisible]:无法识别的选择发送到实例0x352550' – 4thSpace 2010-03-22 00:22:21

+0

对不起,回答太匆匆。现在纠正了...... – h4xxr 2010-03-22 00:42:21

+0

你也可以直接调用viewDidLoad和好友,尽管这会带来你忘记它的风险,并在将来让它们被怪异地调用。 – toholio 2010-03-22 02:05:03

0

viewDidLoadviewWillAppear被称为上的UIViewController子类,commentSubmissionView看起来像一个UIView子类。正如马特提到的,你可能想要推/呈现一个视图控制器,而不是仅仅添加一个子视图。