gpt4 book ai didi

ios - 通过 Interface Builder 创建的 UIView 在 vi​​ewDidLoad 中没有 subview

转载 作者:行者123 更新时间:2023-11-29 12:32:58 25 4
gpt4 key购买 nike

上下文:

  • MainView.xib :我已经布置了我的 UI 元素,并使用自动布局精心地将它们完美对齐。有一大堆 UIButtons、一个 UILabel 和一个 UIToolbar。层次结构非常扁平,如下所示:

    UIView // Hooked up to ViewController
    |
    - UILabel
    - UIButton
    - UIButton
    - UIButton
    - ... // more buttons
    - UIToolbar
  • ViewController.m :

    #import "ViewController.h"

    @interface ViewController ()

    @property NSArray *_allButtons;

    // Interface elements
    @property IBOutlet UILabel *titleLabel;
    @property IBOutlet UIButton *button1;
    @property IBOutlet UIButton *button2;
    // ... lots more buttons
    @property IBOutlet UIToolbar *toolbar;

    @end

    @implementation ViewController

    - (void)loadView {
    UIView *mainView = [[[NSBundle mainBundle] loadNibNamed:@"MainView"
    owner:self
    options:nil] objectAtIndex:0];
    self.view = mainView;
    }

    - (void)viewDidLoad {
    [super viewDidLoad];

    // BREAK_POINT

    // ... code to wire up the UIButtons to dynamically created objects
    }

奇怪的观察:

我已经正确连接了我单独创建的 IBOutlet UIButton button<n>指向 .xib 文件中的 UIButtons 的指针。该代码工作正常。

但是,像这样单独维护所有按钮是一件很痛苦的事情。我可以通过编程方式创建它们,但在 Interface Builder 中以可视方式移动它们会更好(现在我已经学会了如何使用它)。

我想我可以删除 UIButton 的 IBOutlet 连接,并在 MainView.xib 中找到它们作为主 UIView 的 subview ,在 viewDidLoad 中使用类似这样的代码:

for (UIView *view in self.view.subviews) {
if( [view isKindOfClass:[UIButton class]]) {
[self._allButtons addObject:view];
}
}

不幸的是,self._allButtons原来是一个空数组。

因此,我恢复了 IBOutlet 连接,在 viewDidLoad 中的一个断点处掉线了,并看到了这个:

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

这太奇怪了……button1已初始化,但不是 UIView 的 subview 。

问题:

1。为什么是self.view.subviews viewDidLoad 中为空?

2。有没有一种方法可以在 Interface Builder 中创建 UIButton 并在 viewDidLoad 中获取对它们的引用? ?

最佳答案

尝试在

中做到这一点
- (void)viewDidLayoutSubviews{


}

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

关于ios - 通过 Interface Builder 创建的 UIView 在 vi​​ewDidLoad 中没有 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27148165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com