gpt4 book ai didi

ios - addChildViewController 实际上做了什么?

转载 作者:IT王子 更新时间:2023-10-29 07:29:26 31 4
gpt4 key购买 nike

我是第一次涉足 iOS 开发,我必须做的第一件事就是实现 custom container view controller - 让我们称它为 SideBarViewController - 交换它显示的几个可能的 subview Controller 中的哪一个,几乎与标准的 Tab Bar Controller 完全一样。 (它几乎是一个标签栏 Controller ,但有一个可隐藏的侧面菜单而不是标签栏。)

按照 Apple 文档中的说明,每当我将子 ViewController 添加到我的容器时,我都会调用 addChildViewController。我用于换出 SideBarViewController 显示的当前 subview Controller 的代码如下所示:

- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];

[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];

newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}

然后我开始尝试弄清楚 addChildViewController 在这里做了什么,我意识到我不知道。除了将新的 ViewController 粘贴到 .childViewControllers 数组中外,它似乎对任何东西都没有影响。从子 Controller 的 View 到我在 Storyboard上设置的子 Controller 的操作和导出仍然可以正常工作,即使我从不调用 addChildViewController,我无法想象它还会影响什么。

确实,如果我重写我的代码不调用 addChildViewController,而是看起来像这样......

- (void)showViewController:(UIViewController *)newViewController {

// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;

[oldViewController.view removeFromSuperview];

newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];

currentChildViewController = newViewController;
}

...据我所知,我的应用程序仍然可以完美运行!

Apple 文档没有详细说明 addChildViewController 的作用,或者我们为什么要调用它。在 UIViewController Class Reference 的部分中完整地描述了该方法的作用或为什么要使用它。目前是:

Adds the given view controller as a child....This method is only intended to be called by an implementation of a custom container view controller. If you override this method, you must call super in your implementation.

同一页前面还有这段:

Your container view controller must associate a child view controller with itself before adding the child’s root view to the view hierarchy. This allows iOS to properly route events to child view controllers and the views those controllers manage. Likewise, after it removes a child’s root view from its view hierarchy, it should disconnect that child view controller from itself. To make or break these associations, your container calls specific methods defined by the base class. These methods are not intended to be called by clients of your container class; they are to be used only by your container’s implementation to provide the expected containment behavior.

Here are the essential methods you might need to call:

addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:

但它没有提供任何线索,说明它所谈论的“事件”或“预期收容行为”是什么,或者为什么(甚至何时)调用这些方法是“必要的”。

Apple 文档的“Custom Container View Controllers”部分中的自定义容器 View Controller 的示例都调用了此方法,因此我认为它除了将子 ViewController 弹出到数组之外还有一些重要的用途,但我可以弄清楚那个目的是什么。这个方法有什么作用,为什么要调用它?

最佳答案

我认为一个例子胜过千言万语。

我正在开发一个图书馆应用程序,想要展示一个漂亮的记事本 View ,当用户想要添加笔记时它会出现。

enter image description here

在尝试了一些解决方案之后,我最终发明了自己的自定义解决方案来显示记事本。因此,当我想显示记事本时,我创建了一个新的 NotepadViewController 实例,并将其 Root View 作为 subview 添加到主视图。到目前为止一切顺利。

然后我注意到在横向模式下,记事本图像部分隐藏在键盘下方。

enter image description here

所以我想更改记事本图像并将其向上移动。为此,我在 willAnimateRotationToInterfaceOrientation:duration: 方法中编写了正确的代码,但是当我运行该应用程序时,什么也没有发生!调试后我注意到 UIViewController 的旋转方法都没有在 NotepadViewController 中实际调用。只有主视图 Controller 中的那些方法被调用。

为了解决这个问题,我需要在主视图 Controller 中调用 NotepadViewController 中的所有方法时手动调用它们。这很快会使事情变得复杂,并在应用中的不相关组件之间产生额外的依赖关系。

那是过去,在引入 subview Controller 的概念之前。但是现在,您只需将 addChildViewController 添加到主视图 Controller ,一切都会按预期工作,无需任何手动操作。

编辑:有两类事件被转发到 subview Controller :

1-外观方法:

- viewWillAppear:
- viewDidAppear:
- viewWillDisappear:
- viewDidDisappear:

2- 旋转方法:

- willRotateToInterfaceOrientation:duration:
- willAnimateRotationToInterfaceOrientation:duration:
- didRotateFromInterfaceOrientation:

您还可以通过覆盖 shouldAutomaticallyForwardRotationMethods 来控制要自动转发的事件类别和 shouldAutomaticallyForwardAppearanceMethods .

关于ios - addChildViewController 实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17192005/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com