【发布时间】:2015-01-24 19:05:02
【问题描述】:
我使用 Interface Builder 创建了一堆 UI 元素,并使用 IBOutlets 将它们连接到我的 ViewController。
但是,当我尝试在 ViewController 的 viewDidLoad 方法中迭代 self.view.subviews 时,我发现 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处的调试器输出:(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”并删除了我的ViewController.m 中的loadView 实现,我仍然看到相同的self.view.subviews 行为。
【问题讨论】:
-
你不应该碰
–loadView方法,因为你可能会弄乱加载会话——就像你现在正在做的那样——但即使你会碰它,你也必须调用@ 987654334@,否则你会破坏加载链——就像你现在正在做的那样。 -
好吧,我想不出任何其他方式来加载我的 xib。我开始以编程方式创建所有内容,然后切换到使用 xib。这是我让它工作的唯一方法。
-
遵照@wolffan 的建议,重命名了xib,去掉了
loadView代码。我仍然看到相同的行为。 -
FWIW,在我设法通过代码中的
init实例化视图控制器之后,空subviews的效果相同——这是一个不正确的 q&d 疏忽——而不是通过情节提要,来自那个控制器应该来的地方…… -
…确实,有一个related question针对不同样式的实例化视图控制器来寻址子视图
标签: ios objective-c iphone uiviewcontroller interface-builder