在哪里设置子视图的层属性?为什么不在initWithCoder中

人气:691 发布:2022-10-16 标签: ios custom-controls objective-c uiview uitableview

问题描述

我创建了一个自定义UITableViewCell(在本例中,假设子类是MyViewCell),它有一个关联的NIB文件MyViewCell.xib。笔尖包含一个UITableViewCell和一个子视图UIView(名为cardContainer),它只是一个蓝色背景的矩形。我想在UIView周围添加一个投影,所以我在-initWithCoder调用中添加了set层属性:

@implementation MyViewCell


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


- (void) initView
{
    UIBezier Path*shadowPath =[UIBezierPath bezierPathWithRect:view.bounds];        
    [self.cardContainer.layer setShadowColor: [UIColor blackColor].CGColor];
    [self.cardContainer.layer setShadowOpacity: 0.8];
    [self.cardContainer.layer setShadowRadius:3.0];
    [self.cardContainer.layer setShadowOffset: CGSizeMake(2.0,2.0)];
    view.layer.shadowPath = shadowPath.CGPath;
}


@end

我遇到的问题是没有绘制这些层属性。如果我在awakeFromNibdrawRect内调用-initView调用,它将按预期绘制。我的问题是:为什么我的原始代码不起作用?我应该往哪里打电话initView?是否存在某个视图生命周期?我知道initWithCoder没有连接插座,但它在运行时没有崩溃。

我通读了Apple documentation around Views,并搜索了SO问题,但没有找到答案。我找到了这个SO answer,但再次无法解释。

推荐答案

嘿,我找到了一个更好的方法,只需为子视图添加一些运行时属性cardContainer

像这样

.m文件中不再有代码。

编辑:

发件人:NSNibAwaking Protocol

重要提示:由于无法保证从存档实例化对象的顺序,因此您的初始化方法不应向层次结构中的其他对象发送消息。可以从wakeFromNib内部安全地将消息发送到其他对象-到那时,可以确保所有对象都未存档和初始化(当然,不一定被唤醒)。

354