- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我是第一次涉足 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 ,当用户想要添加笔记时它会出现。
在尝试了一些解决方案之后,我最终发明了自己的自定义解决方案来显示记事本。因此,当我想显示记事本时,我创建了一个新的 NotepadViewController
实例,并将其 Root View 作为 subview 添加到主视图。到目前为止一切顺利。
然后我注意到在横向模式下,记事本图像部分隐藏在键盘下方。
所以我想更改记事本图像并将其向上移动。为此,我在 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/
渐进增强和优雅降级基本是一回事吗? 最佳答案 不完全是。他们从不同的 Angular 解决类似的问题。 “优雅的降级”意味着你有漂亮的功能,并且可以在不支持它的浏览器中处理它不那么漂亮(但仍然需要它以
在过去的几周里,我一直在调优和处理 PostgreSQL,我将在我的下一个项目中使用它。 我的规范是: DigitalOcean 8 核 16GB SSD x2(一个用于数据库,另一个用于 Web)
我看过很多关于负数模的问题的答案。每一个答案都放了标准 (a/b)*b + a%b is equal to a 解释。我可以用这种方法计算任何模数,而且我知道有必要使用一个模数函数,如果它是负数,则将
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
The docs假设所有标签都存储在 .hgtags 中,但这里显然存在一些黑魔法。 我的标签如下所示: mbayazit:~/test$ cat .hgtags 0d80b6ba4ba3b51a44
我正在尝试强制删除待处理的更改列表。所有文件(20 个旧文件)都是新文件,但尚未提交/提交。所以在 p4Win 中,它们显示红色 + 十字。我无法从更改列表中删除这些文件。我该如何删除这些文件? 感谢
如果我要删除的文件不属于工作区,那么如何从工作区的目录中删除文件? 我的文件系统上有一个目录,其中包含从 perforce 获取的文件,但在某些进程运行后,它会在这些目录中创建一些新文件。 是否有 p
就是好奇这个。以下是同一功能的两个代码片段: void MyFunc1() { int i = 10; object obj = null; if(something) ret
我对使用约束布局还很陌生,我在调整布局大小方面遇到了问题,我希望它能够响应,这样我就不必再为不同的屏幕尺寸制作 10 个布局。在布局编辑器中,一切在不同尺寸下看起来都很完美,但实际上并非如此。 我做了
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
如果试图修改声明为 const 的对象,const 类型限定符会导致编译器发出错误消息,但这还不够保护。例如以下程序修改声明为 const 的数组的两个元素: #include int main(v
我不得不问这个,因为:我唯一知道的是,如果断言失败,应用程序就会崩溃。这就是为什么要使用 NSAssert 的原因吗?或者这样做还有什么好处?将 NSAssert 置于我在代码中所做的任何假设之上是否
我正在处理我的操作系统项目的 POSIX 子系统,并且我已经达到了我想要处理 pthreads 支持的地步。但是,我不确定我应该在多大程度上实现它们。 最常用的 pthreads 功能是什么?现在有什
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
我正在尝试运行测试类,但抛出错误实际上有零交互。 class Xtractor{ void extractValues(request,Map m1, Map m2,Map m3){
我有一个抽象类UIObject,如下所示: public abstract class UIObject { private final int tabOrder; public UI
这是我尝试在 emacs lisp 中进行一些计算时得到的... (+ 2082844800. 1274511600.0) => 1209872752.0 (+ 2082844800.0 127451
我想用一条垂直线将屏幕分成两部分。垂直线应该从屏幕底部一直延伸到导航栏。如果我们使用 html/css,我只会有 2 个 div,并在右侧 div 上放置一个左边框。如果有办法在 View 的单侧放置
我有一个EC2实例可以正常工作数月(仍在开发中,应用程序尚未启用),但是我只是意识到我什至不知道如何根据流量来扩大/缩小EC2实例。 亚马逊提供的大量服务是压倒性的,我对此感到非常困惑。 最初,虽然我
考虑这个代码: int i = 1; int x = ++i + ++i; 我们对编译器可能会为这段代码做些什么有一些猜测,假设它可以编译。 两者 ++i返回 2 ,导致 x=4 . 一 ++i返回
我是一名优秀的程序员,十分优秀!