【发布时间】:2013-09-06 14:53:31
【问题描述】:
如果我想以编程方式初始化视图,这应该发生在视图控制器生命周期的哪个位置?
最初的直觉是 loadView。但是,在这里,我们还没有视图本身的框架(计算视图的大小/位置所必需的)。 viewDidLoad 也是如此。
下一个直觉是viewWillAppear——在这里我们(最终)保证了视图的框架。但是,这有可能在整个 vc 生命周期中被多次调用。 viewDidAppear 等...
最后,我找到了 viewWillLayoutSubviews。这适用于大多数静态布局的初始化——但是,每当任何视图移动时,都会再次调用它(与 viewWillAppear 的问题相同)。
我已经看到建议在 loadView 中初始化视图并在 viewWillLayoutSubviews 中设置它们的框架(因为设置框架应该是幂等的,谁在乎它是否被称为一对次)。但是为什么苹果那么强烈地鼓励initWithFrame:作为UIViews的标准初始化方法(https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/viewpg_iphoneos/CreatingViews/CreatingViews.html)呢?
将我所有的 UIViewController 子类化为具有 initWithViewFrame: 方法会不会很疯狂?这样我可以传入一个框架,立即在 loadView 中手动设置它并完成它?还是在 viewWillAppear 中有一个 viewHasBeenFormatted 标志,如果没有设置,调用视图的格式然后设置它会更好吗?
或者这只是苹果的说法“使用界面生成器,否则你就完蛋了”?
感谢任何帮助!
编辑- 在我的意思是 viewWillAppear 的地方不小心写了 loadView(在最后一段)
更新-我想我已经接受了这样一个事实,即没有地方可以
- 框架是众所周知的
- 代码只会运行一次(设置时)
看起来您应该 initWithFrame: 您在 viewDidLoad 中的所有视图(但我猜该视图的内容不应将该框架视为远程最终的?因为它是根据假设得出的?呃......)。然后在 layoutSubviews 中重新设置它们的框架。并确保手动处理初始布局和布局之间的差异,因为那里移动了视图......伙计,我觉得我必须遗漏一些东西......(哈哈否认......)
我猜是这样,或者提交并使用 IB。
update2- viewWillLayoutSubviews 将在其子视图之一被调整大小时被调用。所以它仍然不合格,因为它不符合我正在寻找的所需特征的属性 2。 :(
【问题讨论】:
标签: ios objective-c cocoa-touch