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