我可以使用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.
}
}