Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么self.view.subviews在viewDidLoad中是空数组?_Ios_Objective C_Iphone_Uiviewcontroller_Interface Builder - Fatal编程技术网

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

Ios 为什么self.view.subviews在viewDidLoad中是空数组?,ios,objective-c,iphone,uiviewcontroller,interface-builder,Ios,Objective C,Iphone,Uiviewcontroller,Interface Builder,我已经使用Interface Builder创建了一组UI元素,并使用IBOutlets将它们连接到我的ViewController 但是,当我尝试在ViewController的viewDidLoad方法中遍历self.view.subview时,我发现子视图数组是空的 ViewController.xib: UIView | - UILabel - UIButton - // ... more stuff - UIToolbar ViewController.m: #import "V

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

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

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

    (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>>
    
    (lldb)po self.view
    (lldb)po self.view.subview
    (
    )
    (lldb)po[self.view.subviews count];
    无
    (lldb)采购订单自动按钮1
    
当UIButtons等已正确初始化并连接到IBOutlet时,是否知道self.views.subview为何为空



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

我相信这可能与加载视图的方式有关。 在ViewController上,如果nib和VC在IB上正确链接,则无需使用loadView或NSBundle来加载nib

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


请参阅链接:

如果将设置代码移动到
视图,将出现

请尝试在

- (void)viewDidLayoutSubviews{


}

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

您不应该触摸
–loadView
方法,因为您现在正在进行加载操作,这样会弄乱加载过程,但即使您要触摸它,也必须调用
[超级loadView],否则您会破坏加载链–因为您现在正在这样做。好的,我想不出任何其他方法来加载我的xib。我开始以编程的方式创建所有内容,然后改用xib。这是我唯一能让它工作的方法。遵循下面@wolffan的建议,重新命名了xib,去掉了
loadView
代码。我仍然看到了相同的行为。FWIW,空
子视图的相同效果
,在我通过不正确的code-a q&d监督中的
init
实例化了一个视图控制器之后,而不是通过故事板,该控制器应该来自哪里……事实上,有一个针对不同样式的实例化视图控制器的寻址子视图,好吧,所以我将
MainView.xib
重命名为
ViewController.xib
,并从
ViewController.m
中删除了
loadView
,应用程序仍然运行良好。然而,我仍然看到self.views.subviews的行为。我以前确实读过@Marco的答案,我很熟悉这种差异,并且有无限堆栈跟踪的东西。我不知道Interface Builder在ViewController生命周期中的位置。确定@Vidur而不是访问子视图阵列,您直接从其属性中获取视图吗?他们在吗?编辑:抱歉,没有阅读您的编辑。看起来很奇怪。。。你能显示IB的屏幕和连接吗?我是根据@AugustinePA的答案计算出来的。谢谢你的帮助,真的很管用谢谢!阅读苹果iOS库中的ViewController生命周期,现在就更有意义了。