我一直主要使用情节提要,直到最近我转向只用代码创建控制器。
我遵循我们的编码标准在loadView()
函数中创建了一些子视图,其中第一行是super.loadView()
。
从观察到的结果来看,在我叫super.loadView()
之后,self.view
的框架已经使用viewController本身正确设置了,而这正是viewController的框架。
我有更多经验的同事说,这在过去是100%不起作用,应该改为给您CGRectZero
,也许我不应该依赖它。
我想听听其他人的建议。
这是我的示例项目设置:
1.创建一个简单的项目
2.在第一个VC中添加一个按钮
3.通过代码创建第二个VC,在第二个VC中覆盖loadView()
函数,在其中调用super.loadView()
并在下一行打印self.view.bounds
4. self.present
或在按钮操作中使用VC1中的导航控制器来呈现或推送到VC2
5.它总是给我正确的第二个VC框架。
请让我知道。
-----------编辑-------------
为澄清我的问题,我知道诸如viewDidLayoutSubviews
或layoutSubViews
之类的生命周期函数可以返回正确的视图。我不问这些。
我的问题是为什么loadView()
IS 现在向我返回正确框架。
答案 0 :(得分:2)
不幸的是,我无法提供有关幕后情况的任何见解-尽管我可以做的是告诉您,根据documentation,您不应该打电话给super.loadView()
:>
您可以重写此方法以便手动创建视图。如果选择这样做,请将视图层次结构的根视图分配给view属性。您创建的视图应该是唯一的实例,并且不应与任何其他视图控制器对象共享。 您对此方法的自定义实现不应调用super。
(强调我的)
答案 1 :(得分:0)
1)我一直主要使用情节提要,直到最近我转向只用代码创建控制器。
我遵循我们的编码标准在loadView()函数中创建了一些子视图,其中第一行是super.loadView()。
If you use Interface Builder to create your views and initialize the view controller, you must not override this method.
所述,请在loadView上使用viewDidLoad,如Apple Docs的loadView中所述。2)我有更多经验的同事说,这在过去是100%不起作用的,它应该给您CGRectZero,也许我不应该依赖它。
我想听听其他人的建议。
viewWillLayoutSubviews
时。至于其子视图,viewDidLayoutSubviews
是您所需要的另外,这个问题与您的问题直接相关: Why am I having to manually set my view's frame in viewDidLoad?