【问题标题】:View load methods not firing查看加载方法未触发
【发布时间】:2010-03-22 00:05:05
【问题描述】:

我正在加载这样的视图:

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

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

【问题讨论】:

    标签: iphone cocoa-touch uiview uiviewcontroller


    【解决方案1】:

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

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

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

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

    在您将视图添加到另一个视图的情况下,您必须自己在视图控制器上调用 viewWillAppear:viewDidAppear:,否则它们不会发生。

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

    您不需要在addSubview: 后面加上bringSubviewToFront:,因为addSubview: 总是添加到前面。同样,来自addSubview:的文档

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

    【讨论】:

    • 谢谢。在 #1 中,您说“...添加到视图不算数...”但文档指出,“您可以使用 addSubview: 方法直接将视图添加到窗口...”。由于我使用的是 addSubview,所以该方法应该正确触发吗?
    • addSubview: 仅当您在窗口上调用 addSubview: 时才会触发 viewDidAppear: 和 viewWillAppear: (即 [window addSubview:newView])。由于您是在视图上调用它(即 [view addSubview:newView]),因此它不起作用。我不知道为什么 Apple 做出了这种区分,但他们确实做到了。
    【解决方案2】:

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

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

    【讨论】:

    • 这将抛出这个异常:'NSInvalidArgumentException',原因:'*** -[UIView makeKeyAndVisible]:无法识别的选择器发送到实例 0x352550'
    • 您也可以显式调用 viewDidLoad 和朋友,但这会带来您忘记它并在未来被奇怪地调用的风险。
    • viewDidLoad 现在会触发,但不会触发 viewWillAppear。你知道为什么吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多