53

我可以使用viewDidLoad方法UITableviewCell吗?

4

10 回答 10

85

不,您不会在自定义单元类子类 UITableViewCell(It;s part of UIViewController) 中编写 viewDidLoad 。您有一个名为

-(void)layoutSubviews
{
    [super layoutSubviews];
}

您可以在哪里为自定义单元格的控件定义框架和所有内容。请参阅 Apple 的 UITableviewCell 参考

但是请注意,“viewDidLoad”在对象的生命周期中只被调用一次;它更像是一般 OO 编程中的初始化程序。但是,“layoutSubviews”将在每个单元格上被调用多次(取决于滚动等问题)。重要的是要意识到,对于这个原因,你在 viewDidLoad 中“通常做”的许多事情,你不能在 layoutSubviews 中做。

请注意, viewDidLoad 只调用一次: layoutSubviews经常调用。

如果您编写它,它将只是一个简单的功能。

自定义单元教程

于 2012-05-14T06:20:31.617 回答
18

如果您尝试初始化 UITableViewCell 的一些 IBOutlets,您可能需要调用 awakeFromNib():

override func awakeFromNib() {
    super.awakeFromNib()
    // Do your stuff
    // myIBOutlet.text = "Hello" 
}
于 2017-08-07T12:41:59.497 回答
14

最好也打电话super.layoutSubviews()。斯威夫特语法:

override func layoutSubviews() {
    super.layoutSubviews()
}
于 2015-12-03T06:55:39.660 回答
11

AnawakeFromNib()类似于 a viewDidLoad(),因此它运行的频率较低,并且必须为初始化命令调用。

AlayoutSubviews()类似于 a viewWillAppear(),因此当您想要更改视图演示中的某些内容时应该调用它。例如,当用户更改手机方向并且应用程序需要更新某些视图的特定配置时,例如大小、颜色和位置。

Apple关于该awakeFromNib()方法的文档:

概括

从 Interface Builder 存档或 nib 文件加载接收器后,准备接收器进行服务。

宣言

func awakeFromNib()

讨论 nib 加载基础架构向从 nib 存档重新创建的每个对象发送 awakeFromNib 消息,但前提是存档中的所有对象都已加载和初始化。当一个对象收到一个 awakeFromNib 消息时,它保证 已经建立了它的所有出口和动作连接。

您必须调用 awakeFromNib 的超级实现,以使父类有机会执行它们需要的任何其他初始化。虽然这个方法的默认实现什么都不做,但是很多 UIKit 类都提供了非空的实现。您可以在您自己的 awakeFromNib 方法中的任何时候调用超级实现。

于 2019-02-08T12:29:59.980 回答
2

UIKit 函数viewDidLoad是 UIViewController 的成员,UITableViewCell 不继承自它。您可以根据需要编写一个命名 viewDidLoad的方法,但不会像在 UIViewController 子类中那样调用它。

于 2012-05-14T06:18:17.990 回答
2

我意识到这是一个旧线程,但我有时会使用一种模式(特别是如果我的自定义单元有一个基类):

  1. 添加一个 BOOL 属性,将其称为“cellAlreadyDidLoad”。我这样命名它是因为 BOOL 将默认为 NO,所以我不必担心在 init 方法中设置它。

  2. 创建一个 cellDidLoad 方法,这样命名的目的是让它有点像我们都知道和喜爱的 viewDidLoad。

  3. 覆盖 layoutSubviews 方法并添加:

    if (!self.cellAlreadyDidLoad)
    {
        [self cellDidLoad];
        self.cellAlreadyDidLoad = YES;
    }
    

现在您有一个方法 cellDidLoad,它只会被调用一次,因为您知道 UI 元素(包括您的 IBOutlets)将存在。非常类似于视图控制器上的 viewDidLoad。

于 2017-03-15T23:39:22.413 回答
1

如果您的 UITableViewCell 有一个变量,那么您可以像这样使用 didSet

var stickers:[Sticker]? {
    didSet {
        if let stickers = stickers {
            //do some initialisation 
        }
    }
}
于 2018-07-26T13:02:51.443 回答
0

viewDidLoad是的,您可以写入UITableViewCellviewDidLoad不是委托方法,UITableViewCell因此它不会自动调用,因此您必须手动调用它 [self viewDidLoad]才能执行代码。

于 2012-05-14T06:22:17.323 回答
0

您可以将 initWithFrame 用于 UITableViewCell 或 UICollectionViewCell 或 UIView 的任何子类。

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       // Initialisation code here
    }
    return self;
}
于 2015-02-25T11:49:08.333 回答
0

如果您从 XIB 或 Storyboard 加载 UITableViewCell ,initWithCoder()awakeFromNib()调用方法(以相同的顺序)。

如果您以编程方式初始化您的 UITableViewCell ,那么它们将不会被调用。

最后,prepareForReuse()将在将表视图单元格添加到单元格池时对其进行调用。在这种方法中,您应该将表格视图单元格重新设置为新的(例如清理文本字段、标签等)。

所以我建议你使用awakeFromNib()方法来设置你的 UITableViewCell。

例如:-

class YourTableViewCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()

       //do some work here that needs to happen only once, you don’t wanna change them later.
    }
}
于 2020-07-08T09:54:26.777 回答