Ios 为什么self.view.subviews在viewDidLoad中是空数组?
我已经使用Interface Builder创建了一组UI元素,并使用IBOutlets将它们连接到我的ViewController 但是,当我尝试在ViewController的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
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
编辑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生命周期,现在就更有意义了。