iOS - self.view.frame.size.width 为 0.00000

Posted

技术标签:

【中文标题】iOS - self.view.frame.size.width 为 0.00000【英文标题】:iOS - self.view.frame.size.width is 0.00000 【发布时间】:2012-09-24 04:37:48 【问题描述】:

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

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

您是否将frame 分配给SecondViewController,宽度来自未初始化的变量? SecondViewControllerview 位于 FirstViewController 内,其框架设置为 self.view.frame.size.width 那么这就是问题所在,您正在分配尚未初始化的视图的宽度 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于iOS - self.view.frame.size.width 为 0.00000的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别