【问题标题】:UIView - custom view - Where does the view's subviews is initialized?UIView - 自定义视图 - 视图的子视图在哪里初始化?
【发布时间】:2014-09-14 21:12:07
【问题描述】:

我正在创建一个带有一些子视图的自定义 UIView。 在 IB 中 - 我将我的子视图设置为 CreateAlbumView,它是一个 UIView,并创建了一些子视图并输出这些。

当我在代码中扩展此视图并将其添加到超级视图时,将调用以下代码:

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self)
        [self setViews];
    return self;
}

但是那里的子视图都为零 - 使我的 setViews() 函数变得无用。

我已更改代码以在以下函数中设置代码,但似乎不正确:

-(void)layoutSubviews {
    [super layoutSubviews];
    [self setViews];
}

子视图实际在哪里初始化,我可以从哪里开始使用它们?

【问题讨论】:

  • 不要,永远,在 -layoutSubviews 中添加子视图(除非您正在编写自定义表格视图)。

标签: ios objective-c cocoa-touch uiview


【解决方案1】:

你应该使用

- (void)awakeFromNib

nib 加载基础架构向从 nib 存档重新创建的每个对象发送 awakeFromNib 消息,但前提是存档中的所有对象都已加载和初始化。当一个对象收到一个 awakeFromNib 消息时,保证它的所有出口和操作连接都已经建立

【讨论】:

  • 我已经做到了,但实际上不止一次被调用。为什么会这样?
  • 它是在同一个对象上调用的吗?尝试记录 self, NSLog(@"self = %@", self);.
【解决方案2】:

我已更改代码以将代码设置为layoutSubviews,但它 好像不太对。

——好吧,有一个方法来创建视图(setViews 是一个坏名字,因为 cocoa 约定)并布局它们并将它们添加到layoutSubviews,而不是layoutSubviews 完全符合其名称所暗示的那样。

-(id)initWithCoder:(NSCoder *)aDecoder 
{
    self = [super initWithCoder:aDecoder];
    if (self)
        [self createSubviews];
    return self;
}

-(void)layoutSubviews 
{
    [super layoutSubviews];
    for (UIView *v in mySubviews) {
        v.frame = CGRectMake(...);
        [self addSubview:v];
    }
}

【讨论】:

    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多