我可以在UITableviewCell中使用viewDidLoad方法吗?



我可以在UITableviewCell中使用viewDidLoad方法吗?

不,

你不会在自定义单元格类子类中编写 viewDidLoad UITableViewCell(它是 UIViewController 的一部分(。

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

您可以在其中为自定义单元格的控件定义框架和所有内容。参考苹果的UITableviewCell参考

但请注意,'viewDidLoad' 在对象的生命周期中只调用一次;它更像是一般 OO 编程中的初始值设定项。但是,"布局子视图"将在每个单元格上被多次调用(取决于滚动等问题(。 重要的是要认识到,对于这个reson,你在viewDidLoad中"通常做"的许多事情,你不能在layoutSubviews中

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

如果你写它,它将只是一个简单的函数。

自定义单元格教程

如果你正在尝试初始化UITableViewCell的一些IBOutlets,你可能想要使用awakeFromNib((调用:

override func awakeFromNib() {
    super.awakeFromNib()
    // Do your stuff
    // myIBOutlet.text = "Hello" 
}

>最好也调用super.layoutSubviews()。快速语法:

override func layoutSubviews() {
    super.layoutSubviews()
}

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

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

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

总结

接收方从 界面生成器存档或 nib 文件。

声明

func awakeFromNib()

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

你必须调用 awakeFromNib 的超级实现来给父级 类 有机会执行任何其他初始化 需要。尽管此方法的默认实现确实如此 没什么,许多 UIKit 类提供非空实现。你可以 在你自己的任何时候调用超级实现 从笔尖方法清醒。

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

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

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

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

  3. 重写布局子视图方法并添加:

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

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

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

var stickers:[Sticker]? {
    didSet {
        if let stickers = stickers {
            //do some initialisation 
        }
    }
}

如果您从 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.
    }
}

是的,你可以用UITableViewCell编写viewDidLoad,但viewDidLoad不是UITableViewCell的委托方法,所以它不会自动调用,所以你必须通过[self viewDidLoad]手动调用它来执行你的代码。

您可以使用

initWithFrame for UITableViewCell 或 UICollectionViewCell 或 UIView 的任何子类。

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       // Initialisation code here
    }
    return self;
}

就我而言,这工作正常:

override func layoutSubviews() {
    super.layoutSubviews()
    //your code here
}

最新更新