为什么UITableViewCell初始化在initWithCoder中不起作用

时间:2013-10-30 04:41:10

标签: ios objective-c uitableview storyboard

我正在尝试清理我的代码并使用MVC原则,将尽可能多的视图相关内容推送到故事板以及自定义UIView类(即与{{1}上的视图相关内容相反。 }本身)

所以我有一个自定义的UITableViewCell(称为UIViewController),它有几个属性,其中一个是我自己的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; } 只是b / c尚未加载文本。 null也是空的(我不知道为什么我认为它现在应该从笔尖膨胀)但是即使我在这里初始化它...它仍然无法工作。

所以我的工作就是将此单元格自定义部分放在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]; }

内工作

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

CustomCell.m

这使得这更加奇怪。

2 个答案:

答案 0 :(得分:7)

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

  

nib加载基础结构向每个基础结构发送awakeFromNib消息   从nib存档重新创建的对象,但仅在所有对象之后   存档已加载并初始化。当一个对象收到   一个awakeFromNib消息,它保证有所有的插座和   行动关系已经建立。

这样可以解释上面的奇怪行为:initWithCoder实例化一个标准UITableViewCell(已经预先带有backgroundView等等)但是它仍然无法识别出口我已通过故事板添加到它.. awakeFromNib

答案 1 :(得分:0)

我怀疑initWithCoder:方法不会绘制单元格的内容,只是初始化对象,正如您所注意到的那样,访问单元格的任何ui绘制方法实际上“绘制”了单元格以应用您对单元格所做的更改。使用UIViewController方法启动initWithNibName:bundle:时,您可以看到相同的行为。