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

时间:2014-11-26 12:34:32

标签: ios objective-c iphone uiviewcontroller interface-builder

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

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

  • 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处的调试器输出:

    (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>>
    

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


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

3 个答案:

答案 0 :(得分:4)

尝试在

中执行此操作
- (void)viewDidLayoutSubviews{


}

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

答案 1 :(得分:0)

我认为它可能与您加载视图的方式有关。 在viewControllers上,如果您的笔尖和您的VC在IB上正确链接,则无需使用loadView或NSBundle来加载。

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

请参阅链接:iPhone SDK: what is the difference between loadView and viewDidLoad?

答案 2 :(得分:0)

如果您将设置代码移至viewWillAppear

,该怎么办?