我可以使用viewDidLoad方法UITableviewCell吗?
10 回答
不,您不会在自定义单元类子类 UITableViewCell(It;s part of UIViewController) 中编写 viewDidLoad 。您有一个名为
-(void)layoutSubviews
{
[super layoutSubviews];
}
您可以在哪里为自定义单元格的控件定义框架和所有内容。请参阅 Apple 的 UITableviewCell 参考
但是请注意,“viewDidLoad”在对象的生命周期中只被调用一次;它更像是一般 OO 编程中的初始化程序。但是,“layoutSubviews”将在每个单元格上被调用多次(取决于滚动等问题)。重要的是要意识到,对于这个原因,你在 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()
}
AnawakeFromNib()类似于 a viewDidLoad(),因此它运行的频率较低,并且必须为初始化命令调用。
AlayoutSubviews()类似于 a viewWillAppear(),因此当您想要更改视图演示中的某些内容时应该调用它。例如,当用户更改手机方向并且应用程序需要更新某些视图的特定配置时,例如大小、颜色和位置。
Apple关于该awakeFromNib()方法的文档:
概括
从 Interface Builder 存档或 nib 文件加载接收器后,准备接收器进行服务。
宣言
func awakeFromNib()讨论 nib 加载基础架构向从 nib 存档重新创建的每个对象发送 awakeFromNib 消息,但前提是存档中的所有对象都已加载和初始化。当一个对象收到一个 awakeFromNib 消息时,它保证 已经建立了它的所有出口和动作连接。
您必须调用 awakeFromNib 的超级实现,以使父类有机会执行它们需要的任何其他初始化。虽然这个方法的默认实现什么都不做,但是很多 UIKit 类都提供了非空的实现。您可以在您自己的 awakeFromNib 方法中的任何时候调用超级实现。
UIKit 函数viewDidLoad是 UIViewController 的成员,UITableViewCell 不继承自它。您可以根据需要编写一个命名 viewDidLoad的方法,但不会像在 UIViewController 子类中那样调用它。
我意识到这是一个旧线程,但我有时会使用一种模式(特别是如果我的自定义单元有一个基类):
添加一个 BOOL 属性,将其称为“cellAlreadyDidLoad”。我这样命名它是因为 BOOL 将默认为 NO,所以我不必担心在 init 方法中设置它。
创建一个 cellDidLoad 方法,这样命名的目的是让它有点像我们都知道和喜爱的 viewDidLoad。
覆盖 layoutSubviews 方法并添加:
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
}
}
}
viewDidLoad是的,您可以写入UITableViewCell但viewDidLoad不是委托方法,UITableViewCell因此它不会自动调用,因此您必须手动调用它 [self viewDidLoad]才能执行代码。
您可以将 initWithFrame 用于 UITableViewCell 或 UICollectionViewCell 或 UIView 的任何子类。
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialisation code here
}
return self;
}
如果您从 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.
}
}