我能在UITableviewCell中使用viewDidLoad方法吗?

57

我能在UITableviewCell中使用viewDidLoad方法吗?


你对定制的表格视图单元感兴趣吗? - rishi
在编程中,首先要在ViewDidLoad中告诉做什么? - Dev
11个回答

87
不,你不需要在自定义的单元格类UITableViewCell的子类中编写viewDidLoad方法(它是UIViewController的一部分)。你可以使用一个名为的方法。
-(void)layoutSubviews
{
    [super layoutSubviews];
}

你可以在其中定义自定义单元格控件的框架和其他内容。请参考苹果的UITableviewCell参考文献

需要注意的是,'viewDidLoad'方法在对象的生命周期中仅被调用一次,它类似于面向对象编程中的初始化器。然而,'layoutSubviews'方法会被多次调用(取决于滚动等问题)在每个单元格上。重要的是要意识到,由于这个原因,许多通常在viewDidLoad中执行的任务,你不能在layoutSubviews中进行。

需要注意的是:viewDidLoad只被调用一次,layoutSubviews经常被调用。

如果你写一个简单的函数,它就可以了。

自定义单元格教程


请问在 uiTableViewCell 中自动调用的第一个方法是什么? - user5457
  • initWithStyle:reuseIdentifier: 是首先被调用的。我已经在上面给出了一个教程,你可以看一下。
- Abhishek Singh

18

如果您想初始化UITableViewCell的一些IBOutlets,您可以尝试使用awakeFromNib()方法:

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

awakeFromNib 确实看起来是最接近 viewDidLoad 的东西。 - Skoua

14
更好的方式是同时调用 super.layoutSubviews()。Swift 语法:
override func layoutSubviews() {
    super.layoutSubviews()
}

13

awakeFromNib()viewDidLoad()类似,它们都是用于初始化的方法。但是awakeFromNib()不会像viewDidLoad()那样频繁地运行,初始化命令必须在其中调用。

layoutSubviews()类似于viewWillAppear(),所以当您想要更改视图显示时应该调用它。例如,当用户更改手机方向并且应用程序需要更新一些特定配置(如大小、颜色和位置)时。

关于awakeFromNib()方法,苹果公司的文档如下:

摘要

从Interface Builder存档或nib文件中加载完成后,准备接收服务。

声明

func awakeFromNib()

讨论 nib加载基础设施会向从nib存档重建的每个对象发送awakeFromNib消息,但只有在存档中的所有对象都已加载和初始化之后才会发送此消息。当对象接收到awakeFromNib消息时,可以保证其所有输出口和动作连接已经建立。

您必须调用awakeFromNib的超级实现,以使父类有机会执行任何其他所需的初始化。虽然此方法的默认实现什么也不做,但许多UIKit类提供非空实现。您可以实现自己的awakeFromNib方法或使用父类中的实现。

在您自己的awakeFromNib方法中随时调用超级实现。

2

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


请问在 uiTableViewCell 中自动调用的第一个方法是什么? - user5457
1
这不是那么简单的事情。 这取决于您使用的UITableView类型。 传统上,UITableView会通过cellForRowAtIndex代理方法请求一个自定义单元格。 如果能更多地了解您要做什么将会非常有帮助。 - borrrden

2

我知道这是一个老旧的话题,但有时我会使用以下模式(特别是如果我的自定义单元格有一个基类):

  1. Add a BOOL property, call it something like "cellAlreadyDidLoad". I named it that way because BOOL will default to NO, so I don't have to worry about setting it in an init method.

  2. Create a cellDidLoad method, named so with the intent that it's kind of like the viewDidLoad that we all know and love.

  3. Override the layoutSubviews method and add:

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

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


1
如果您的UITableViewCell具有变量,则可以像这样使用didSet
var stickers:[Sticker]? {
    didSet {
        if let stickers = stickers {
            //do some initialisation 
        }
    }
}

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

0

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


请问在 uiTableViewCell 中自动调用的第一个方法是什么? - user5457

0

你可以在UITableViewCell或UICollectionViewCell或任何UIView的子类中使用initWithFrame。

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

这不是给我打的电话。 - Alper
3
只有在动态创建单元格时才会调用它,否则您可以使用-(id)initWithCoder:(NSCoder *)aDecoder- (void)awakeFromNib来进行初始化。 - Shabeer Ali
动态地意味着什么? - Alper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接