2013-10-30 155 views
4

我试图清理我的代码,并通过推入尽可能多的视图相关的东西,我可以进入故事板以及自定义UIView类使用MVC原则(即相对于做视图相关的东西在UIViewController本身)为什么UITableViewCell初始化不工作在initWithCoder

所以我有一个自定义的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; 
} 

这根本不起作用。对于文本只是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]; 
} 

和它的工作就好了..我很不满意这种方法,我想知道如何让它从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; 
} 

这使得这更奇怪。

+0

也许'initWithCoder:'方法在后台线程上。用'performSelectorOnMainThread:withObject:waitUntilDone:' – theShay

+3

尝试原谅另一个方法的代码。使用awakeFromNib来初始化你的控件,我认为这是最好的函数,但它可以被多次调用。 – andykkt

+0

@theShay我的更新表明,这与后台线程无关 – abbood

回答

7

通过andykkt的评论启发,我发现解释在awakeFromNib文档:

笔尖装载基础设施发送一个awakeFromNib消息从笔尖档案重新每个 对象,但只有在所有对象后在 档案已被加载和初始化。当一个对象收到一个awakeFromNib消息时,它保证已经建立了它的所有插座和动作连接。

,以便将解释上述怪异的行为:initWithCoder实例化一个标准UITableViewCell(已经自带了backgroundView等等等等预焙)..但它仍然不承认我已经通过加给它的网点故事板.. awakeFromNib呢。

0

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

相关问题