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

Ios 为什么UITableViewCell初始化在initWithCoder中不起作用,ios,objective-c,uitableview,storyboard,Ios,Objective C,Uitableview,Storyboard,我正试图清理我的代码并使用MVC原则,将尽可能多的视图相关的内容放入情节提要以及自定义UIView类中(即与在UIViewController本身上执行视图相关的内容相反) 因此,我有一个自定义UITableViewCell(称为CustomCell),它有几个属性,其中一个是我自己的标签。由于我是从故事板加载单元格,我用initWithCoder而不是initWithStyle:reuseIdentifier:初始化它,这是我在CustomCell.m中的内容,它是UITableViewCel

我正试图清理我的代码并使用MVC原则,将尽可能多的视图相关的内容放入情节提要以及自定义UIView类中(即与在
UIViewController
本身上执行视图相关的内容相反)

因此,我有一个自定义UITableViewCell(称为
CustomCell
),它有几个属性,其中一个是我自己的
标签。由于我是从故事板加载单元格,我用
initWithCoder
而不是
initWithStyle:reuseIdentifier:
初始化它,这是我在
CustomCell.m
中的内容,它是
UITableViewCell
的子类(由于某些原因,我无法理解如何使用故事板设置自定义字体。但这与问题无关):

这根本不起作用。log语句为文本输出
null
,只是b/c文本尚未加载。
self.label
也为null(我不知道为什么我认为它现在应该从nib膨胀),但即使我在这里初始化它。它仍然不起作用

因此,我的工作就是简单地将此单元格自定义部分放在
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

<强> Update:使事情更加有趣。如果我在UnITE中使用UITababVIEW单元格属性定制代码,它们就工作了!请考虑这个例子:

- (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;
}

这使得这更奇怪。

我怀疑
initWithCoder:
方法没有绘制单元格的内容,它只是初始化对象,正如您所注意到的,访问单元格的任何ui绘制方法实际上“绘制”了单元格,以应用您对单元格所做的更改。在使用
initWithNibName:bundle:
方法初始化
UIViewController

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

nib加载基础结构向每个用户发送awakeFromNib消息 从nib存档重新创建的对象,但仅在 存档文件已加载并初始化。当对象收到 一条awakeFromNib消息,保证其所有出口和 已建立操作连接


这就解释了上面奇怪的行为:
initWithCoder
实例化了一个标准的
UITableViewCell
(已经预装了背景视图等)…但是它仍然无法识别我通过故事板添加到它中的输出。
awakeFromNib
可以。

可能
initWithCoder:
方法在后台线程上。请尝试使用
performselector或onmainthread:withObject:waitUntilDone:
使用awakeFromNib来初始化控件,我认为是最好的函数,但可以多次调用。@Shay my update显示这与背景线程无关,因此请尝试从NIB中唤醒
awake
viewdiapper
@theShay单元格没有
viewdide:
方法。
- (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;
}