具有自定义类的原型单元不会触发初始化?

Posted

技术标签:

【中文标题】具有自定义类的原型单元不会触发初始化?【英文标题】:Prototype cells with custom class does not fire init? 【发布时间】:2012-03-02 10:38:41 【问题描述】:

我对 Objective-c 很陌生,并且对原型单元有疑问。

我有一个带有自定义单元格的表格视图,效果很好。

现在我的自定义单元格类中也覆盖了 -(id)init-(id)initWithStyle: reuseIdentifier:

如果我对单元格进行类检查,它显然是我的自定义类,但从未调用过任何 init 方法。

所以它为我创建了它们,但不知何故避免解雇-(id)init,这对我来说似乎很奇怪。

我想我可以自己初始化它们,但它们可以在没有被创建的情况下存在似乎真的很奇怪?

谢谢!

【问题讨论】:

是否可能看起来我的类是我的自定义类型,因为我在出队时转换它,并且我的自定义类上的静态字符串有效,因为即使没有真实实例也可以访问它?我只是在集思广益 :) 我可以在星期一发布更多代码。 【参考方案1】:

如果它是来自故事板的原型单元。 - (id)initWithCoder: 被调用。所以你需要覆盖:

- (id)initWithCoder:(NSCoder *)coder

  self = [super initWithCoder:coder];
  if (self) 
       //custom stuff here
  

  return self;

对于从情节提要中唤醒的任何事物都是如此。

【讨论】:

我不能投票给你,但这非常有帮助,我在文档或网络上的任何地方都找不到这些信息,你可能已经帮助了数百名未来的旅行者 :) 严重令人沮丧的是,initWithStyle... init 方法在 UITableViewCell.h 中被称为“指定初始化程序”。遗憾的是,Objective C 没有像 Java 或 C# 等“正确”的 OO 构造函数。【参考方案2】:

您是否从 xib 加载了这些单元格?如果是这样,请尝试改用awakeFromNib

【讨论】:

抱歉,不,我在故事板文件中定义了单元格样式。为了澄清,现在我通过将我的数据对象传递给单元格来设置单元格中的文本。所以在单元格的代码中,我有一个方法,它被调用并且可以工作。问题是我无法覆盖 initWithFrame 或 initWithStyle 甚至 init 并将代码放在那里,因为它永远不会触发。所有单元格都是通过避免 init 在内部和神秘地创建的。这不是一个真正的问题,但我认为这很奇怪。 对我来说,这是正确的答案。此外,它不仅对单元格有用,而且对单元格内的自定义视图也很有用。如果一个人覆盖了它的 awakeFromNib 方法,那么这样一个自定义视图就可以在故事板上工作。太棒了,谢谢!【参考方案3】:

您应该用于初始化自定义单元格的方法是:

   -(id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier

    if(self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier])

    
    return self;    

【讨论】:

那不是已弃用吗?无论如何,它不起作用,与覆盖 init 本身的结果相同,它们都没有被触发,但是一个 const 字符串被初始化并且可以得到,所以它绝对是一个从未经历过任何 init 的类的实例。谢谢'

以上是关于具有自定义类的原型单元不会触发初始化?的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义类的 QtScript instanceof 引发与原型相关的错误

在 tableView(:didSelectRowAt) 中为自定义表格单元格 UILabel 设置值

自定义单元格未显示

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

使用从 Storyboard 定义的自定义 UITableViewController 和原型单元进行随机 UI 更新

原型单元格不会显示内容