为啥 viewDidAppear 没有被触发?

Posted

技术标签:

【中文标题】为啥 viewDidAppear 没有被触发?【英文标题】:why does viewDidAppear not get triggered?为什么 viewDidAppear 没有被触发? 【发布时间】:2009-11-11 22:24:01 【问题描述】:

我有一个根视图控制器,它在其 viewDidLoad 方法的索引 0 处插入一个子视图。

我试图让子视图成为 firstResponder,但据我所知,只能在子视图的 viewDidAppear 方法中做到这一点。

这是我添加到根视图控制器的 viewDidLoad 方法的代码行:

        [self.view insertSubview: subViewController.view atIndex: 0];

subviewcontroller 有一个 xib,subViewController.xib,它在运行时正确显示。尽管如此,subViewController 的 viewDidAppear 并没有被触发。

知道为什么会这样吗?知道如何解决这个问题 - 除了手动调用 viewDidAppear(这样做会导致无法成为 firstResponder)?

谢谢,

姆博塔

【问题讨论】:

【参考方案1】:

您必须将视图 控制器 推送到导航堆栈,以便调用它的委托方法。将视图控制器的视图添加到子视图数组不会调用它们。您应该做的第一件事是阅读View Controller Programming Guide from Apple,因为这将使您免于以非标准方式执行此操作而造成的一些麻烦。

不要将视图添加到根视图控制器子视图中,而是这样做:

SubviewController *controller = [[SubviewController alloc] init];
[[self navigationController] pushViewController:controller animated:YES];
[controller release], controller = nil;

现在您的委托方法将被调用。但是,如果您没有导航控制器作为您的根视图控制器,这将不起作用。

【讨论】:

谢谢!也就是说,实际上是这样的:我不打算在这个项目中使用导航控制器。我昨天通读了你提到的编程指南(谢谢),只是为了确定,但我真的找不到任何可以帮助我的东西。变得……绝望。 我想我的意思是,您尝试做的事情并不可取,因为您找不到解决方案。您可能对呈现与标准不同的视图的方式有一个好主意,这可能很棒,但是,通常您会更容易坚持 Apple 通过导航堆栈或选项卡为您提供的内容意见。也许如果您详细说明您正在尝试做什么,那么 SO 上的人们可以就适合您要求的不同但足够的方法提出一些建议。最好的问候。 好点。事实上,正如我稍后会在回答我自己的问题时指出的那样,我选择放弃这个特殊的设计,转而使用一个更简单的设计:实用程序模板,我相信它被称为(现在不在我的 mac 上)。使用该模板,就没有根视图控制器需要打扰。有一个主视图是翻转视图的委托。两者都被适当地触发,这首先是我设计的重点。谢谢你把这个错误放在我的脑海里!【参考方案2】:

如果我没记错的话(抱歉,现在在文档中找不到该位置)-viewDidAppear 不会被子视图调用。必须在父视图控制器的 -viewDidAppear 方法中手动调用。

【讨论】:

真的吗?哎呀,这很不幸:我自己应该在文档中发现,becomeFirstResponder 不喜欢当我明确调用 viewDidAppear 时。不过谢谢,我会尝试找到参考。

以上是关于为啥 viewDidAppear 没有被触发?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以在 viewDidAppear 中访问 Core Data 实体,但不能在 viewDidLoad 中访问?

为啥 UIScrollView contentSize 在 IB 中被忽略,但当我在 viewDidAppear 方法中设置它时有效?

为啥 cellForRowAtIndexPath 没有被触发,但其他方法被触发了?

UIApplication.statusBarStyle 在 vi​​ewWillAppear 和 viewDidAppear 之间变化

为啥 useEffect 没有被触发?

为啥这个 `onDraw` 没有被触发?