为什么self.view.subviews在viewDidLoad中是一个空的数组?

我使用Interface Builder创build了一堆UI元素,并使用IBOutlets将它们连接到我的ViewController。

但是,当我尝试在ViewController的viewDidLoad方法中遍历self.view.subviews时,发现子视图数组是空的。

  • ViewController.xib

     UIView | - UILabel - UIButton - // ... more stuff - UIToolbar 
  • ViewController.m

     #import "ViewController.h" @interface ViewController () // Interface elements @property IBOutlet UILabel *titleLabel; @property IBOutlet UIButton *button1; // ... etc @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // BREAK_POINT // ... code to wire up the UIButtons to dynamically created objects } 
  • BREAK_POINT处的debugging器输出:

     (lldb) po self.view <UIView: 0x7fa7897e2140; frame = (0 0; 600 600); autoresize = W+H; layer = <CALayer: 0x7fa7897e2210>> (lldb) po self.view.subviews <__NSArrayI 0x7fa789713500>( ) (lldb) po [self.view.subviews count]; nil (lldb) po self.button1 <UIButton: 0x7fa78955ea70; frame = (-23 -15; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fa7897663d0>> 

任何想法为什么self.views.subviews是空的,当明确的UIButtons等已经初始化并连接到IBOutlets正确?


编辑1:我将“MainView.xib”重命名为“ViewController.xib”,并删除了ViewController.m中的loadView实现,我仍然看到相同的self.view.subviews行为。

试着在那里做

 - (void)viewDidLayoutSubviews{ } 

加载所有子视图后调用此方法。 希望对你有帮助 :)

我相信这可能与您加载视图的方式有关。 在viewControllers上,如果你的笔尖和你的VC在IB上正确链接,那么就不需要使用loadView或者NSBundle来加载。

另外,如果您将您的笔尖命名为ViewController,则指定的init将为您正确加载它。 如果使用loadView,则必须自己加载所有的视图树,而不仅仅是主视图。

请参阅链接: iPhone SDK:loadView和viewDidLoad有什么区别?

如果您将您的设置代码移动到viewWillAppear