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

时间:2012-05-14 06:15:29

标签: iphone ios

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

10 个答案:

答案 0 :(得分:77)

不,你不在自定义单元类子类UITableViewCell(它是UIViewController的一部分)中编写viewDidLoad。你有一个名为

的方法
-(void)layoutSubviews
{
    [super layoutSubviews];
}

您可以在其中为自定义单元格的控件定义框架和所有框架。请参阅Apple's UITableviewCell reference

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

请注意,viewDidLoad仅被称为一次:layoutSubviews通常被称为

如果你写它就会是一个简单的功能。

Tutorial for custom cell

答案 1 :(得分:11)

最好还致电super.layoutSubviews()。 Swift语法:

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

答案 2 :(得分:10)

如果您尝试初始化UITableViewCell的某些IBOutlet,您可能需要进行awakeFromNib()调用:

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

答案 3 :(得分:2)

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

layoutSubviews()viewWillAppear()类似,因此当您要在视图表示中更改某些内容时应调用它。例如,当用户更改电话方向并且应用程序需要更新视图的某些特定配置时,例如大小,颜色和位置。

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

  

摘要

     

从接收器加载后,准备好接收器的服务   Interface Builder归档文件或nib文件。

     

声明

     

func awakeFromNib()

     

讨论   笔尖加载基础结构向每个发送awakeFromNib消息   从笔尖存档重新创建对象,但仅在所有对象   归档文件已加载并初始化。当物体接收到   aawakeFromNib消息,保证所有消息都已发送并且   动作连接已经建立。

     

您必须调用awakeFromNib的超级实现才能给父级   类机会执行任何其他初始化操作   要求。尽管此方法的默认实现   没有,许多UIKit类提供了非空的实现。你可以   在您自己的任何时候调用超级实现   awakeFromNib方法。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

  3. 覆盖layoutSubviews方法并添加:

    if (!self.cellAlreadyDidLoad)
    {
        [self cellDidLoad];
        self.cellAlreadyDidLoad = YES;
    }
    
  4. 现在你有一个方法,cellDidLoad,只有一次被调用,知道UI元素(包括你的IBOutlets)将会存在。非常类似于视图控制器上的viewDidLoad。

答案 6 :(得分:0)

是的,您可以在viewDidLoad中写UITableViewCell,但viewDidLoad不是UITableViewCell的委托方法,因此它不会自动调用,因此您必须通过{{手动调用它1}}执行你的代码。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

答案 9 :(得分: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.
    }
}