为啥不调用基于 nib 的自定义表格单元格的 init 方法

Posted

技术标签:

【中文标题】为啥不调用基于 nib 的自定义表格单元格的 init 方法【英文标题】:why does the init-method of a custom nib-based table cell not get called为什么不调用基于 nib 的自定义表格单元格的 init 方法 【发布时间】:2011-08-04 13:19:06 【问题描述】:

我有一个基于 nib 的表格视图单元,它是在界面生成器中创建的。我将表格视图单元格的类设置为从UITableViewCell 扩展的FooTableViewCell

FooTableViewCell 中,我像这样覆盖init 方法:

-(id)init

    if ((self = [super init]))
      // My init code here
    
    return self;

我现在期望 my 在实例化时被调用。然而,表格视图被显示,但该方法从未被调用。

我可以解决这个问题,但我想完全理解它,对我来说,不清楚在不调用 init 方法的情况下如何实现对象。

【问题讨论】:

如果您按照发布的方式从 nib 文件加载单元格,则不需要 'cell = [[StationAndTwoProgramsCell alloc] init]; ' 行 - 使用 alloc/init 单元创建的内容无论如何都会在下一行 'cell = ...' 中被覆盖,这也会导致内存泄漏。 【参考方案1】:

当被取消归档时,初始化会经过稍微不同的路径。

将调用-(id)initWithCoder:(NSCoder*)aDecoder 而不是-(id)init。此时插座未连接,如果您需要访问插座,您可以覆盖-(void)awakeFromNib,它将在对象连接后调用。

【讨论】:

你是救生员!一直试图从自定义超类中找到一种“默认”我所有自定义单元格背景颜色的方法。效果很好!【参考方案2】:

当从 nib 文件加载对象时,它的 -awakeFromNib 方法被调用 - 你可以把你的初始化代码放在那里:

- (void)awakeFromNib
   // Init code

【讨论】:

以上是关于为啥不调用基于 nib 的自定义表格单元格的 init 方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的自定义表格单元格中的标签在单击行之前无法显示

我想在单个表格视图中使用来自 nib 的两个不同的自定义单元格。两个原型电池具有不同的高度

为啥 UITableView 自定义单元格的第一个单元格总是在 Xcode 中的动作事件上被调用两次

从外部 xib/nib 文件导入的自定义按钮不响应按钮单击

为啥自定义表格单元格总是默认大小

表格内容在使用子视图的自定义单元格的 TableView 滚动上消失 - Swift