我可以在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 子类中那样被调用。
我意识到这是一个旧线程,但我有时会使用一种模式(特别是如果我的自定义单元格有一个基类(:
-
添加一个 BOOL 属性,将其称为"cellAlreadyDidLoad"。 我这样命名是因为 BOOL 默认为 NO,所以我不必担心在 init 方法中设置它。
-
创建一个 cellDidLoad 方法,其命名意图是让它有点像我们都知道和喜爱的 viewDidLoad。
-
重写布局子视图方法并添加:
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
}