我有一个视图控制器(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:
方法中,但似乎没有任何效果。
非常感谢任何帮助。
答案 0 :(得分: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
方法中设置视图的宽度,这将保持视图控制器的“延迟加载”行为(并节省内存),同时仍然确保您的视图是宽度将在需要时设置。