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
。
我尝试了很多不同的方法来解决这个问题,比如将方法的内容放在 didRotateFromInterfaceOrientation
和 viewDidAppear:
方法中,但似乎没有任何效果。
任何帮助将不胜感激。
【问题讨论】:
您是否将frame
分配给SecondViewController
,宽度来自未初始化的变量?
SecondViewController
的 view
位于 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的主要内容,如果未能解决你的问题,请参考以下文章