4

我正在尝试清理我的代码并使用 MVC 原则,方法是将尽可能多的与视图相关的内容推送到情节提要以及自定义 UIView 类中(即,而不是自己做与视图相关的内容UIViewController

所以我有一个自定义 UITableViewCell (称为CustomCell),它有几个属性,其中一个是我自己的label。由于我从情节提要加载单元格,因此我使用initWithCoder而不是初始化它initWithStyle:reuseIdentifier:,这就是我所拥有CustomCell.m的子类UITableViewCell(由于某种原因,我无法弄清楚如何使用情节提要设置自定义字体..但是这与这个问题无关):

// CustomCell.m - subclass of UITableViewCell
- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        NSLog(@"customizing cell font having text %@", self.label.text);
        UIFont *customFont = [UIFont fontWithName:@"Montserrat" size:16];
        self.label.textColor = [UIColor redColor];
        [self.label setFont:customFont];
    }
    return self;
}

这根本行不通..null文本的日志语句输出只是 b/c 文本尚未加载。self.label也是空的(我不知道为什么我认为它现在应该从笔尖膨胀)但即使我在这里初始化它..它仍然无法工作。

所以我的工作是简单地将这个单元格自定义部分放在TableViewController

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath *)indexPath {        
    UIFont *customFont = [UIFont fontWithName:@"Montserrat" size:16];
    [((CustomCell *)cell).label setFont:customFont];
}

它工作得很好..我对这种方法不满意,我想知道如何让它从内部工作CustomCell.m

更新:让事情变得更有趣..如果我将 UITableViewCell 属性的自定义代码放在 initWithCoder 中,它们就可以工作!考虑这个例子:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        UIView *bgColorView = [[UIView alloc] init];
        [bgColorView setBackgroundColor:[UIColor blueColor]];
        [self setSelectedBackgroundView:bgColorView];  // actually works!
    }
    return self;
}

这使得这更加奇怪。

4

2 回答 2

7

andykkt评论的启发,我在awakeFromNib文档中找到了解释:

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

所以这解释了上面的奇怪行为:initWithCoder实例化一个标准UITableViewCell(已经用 backgroundView 等预先烘焙)..但是它仍然无法识别我通过情节提要添加到它的插座..awakeFromNib确实。

于 2013-10-30T05:09:37.227 回答
0

我怀疑该initWithCoder:方法不会绘制单元格的内容,它只是初始化对象,并且正如您所注意到的,访问单元格的任何 ui 绘制方法实际上会“绘制”单元格以应用您所做的更改到细胞。UIViewController在 initing的 usinginitWithNibName:bundle:方法时,您可以看到相同的行为。

于 2013-10-30T05:03:33.027 回答