2

我有一个视图控制器(SecondViewController),它有一个名为的方法,该方法setupHomeScreen是从另一个视图控制器(FirstViewController)调用的。此方法在初始化后调用。 SecondViewController

setupHomeScreen中,UIView创建了一个我希望与主视图具有相同边界的边界,这取决于 iPad 是以纵向还是横向模式查看的。

首次调用该方法时(在应用程序启动时),视图完全错误,NSLog输出显示self.view.frame.size.width等于0.0000.

如果我导航到ThirdViewController,然后返回SecondViewController,则视图将正确显示并且self.view.frame.size.width值为768

我尝试了很多不同的方法来解决这个问题,比如将方法的内容放在didRotateFromInterfaceOrientationandviewDidAppear:方法中,但似乎没有任何效果。

任何帮助将不胜感激。

4

1 回答 1

4

首次调用该方法时(在应用程序启动时),视图完全错误,NSLog 输出显示 self.view.frame.size.width 等于 0.0000。

这可能是因为视图尚未加载。视图控制器在真正需要它们之前不会加载它们的视图,这通常是在视图即将第一次显示时。如果您的代码在视图显示之前尝试查找视图的宽度,则很有可能该视图尚未加载。在 Objective-C 中,您可以向 发送消息nil,结果将为 0 或 nil,具体取决于预期的类型。

如果我导航到 ThirdViewController,然后返回到 SecondViewController,视图将正确显示,并且 self.view.frame.size.width 值为 768。

这与上面的解释是一致的;一旦你显示了你的SecondViewController视图层次结构,这些视图就会被加载,并且找到你的视图的宽度是没有问题的。

只需访问视图控制器的view属性就足以导致加载视图层次结构。如果必须的话,您可以通过self.view在调用之前访问来解决您的问题setupHomeScreen。不过,更好的解决方案是在 的-viewDidLoad方法中设置视图的宽度SecondViewController,这将保持视图控制器的“延迟加载”行为(并节省内存),同时仍确保在需要时设置视图的宽度。

于 2012-09-24T04:46:52.287 回答