我可以在viewDidLoad
中使用UITableviewCell
方法吗?
答案 0 :(得分:77)
不,你不在自定义单元类子类UITableViewCell(它是UIViewController的一部分)中编写viewDidLoad。你有一个名为
的方法-(void)layoutSubviews
{
[super layoutSubviews];
}
您可以在其中为自定义单元格的控件定义框架和所有框架。请参阅Apple's UITableviewCell reference
但请注意在对象的生命周期中,'viewDidLoad'仅在 中被称为 ;它更像是一般OO编程中的初始化器。但是,'layoutSubviews' 将在每个单元格上多次调用 (取决于滚动等问题)。重要的是要意识到,为了解决你在viewDidLoad中“通常做”的许多事情,你在 中无法在layoutSubviews中做 。
如果你写它就会是一个简单的功能。
答案 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)
我意识到这是一个旧线程,但我有时使用的模式(特别是如果我有自定义单元格的基类):
添加一个BOOL属性,称之为" cellAlreadyDidLoad"。我这样命名是因为BOOL默认为NO,所以我不必担心在init方法中设置它。
创建一个名为soDidLoad的方法,意图是它有点像我们都知道和喜爱的viewDidLoad。
覆盖layoutSubviews方法并添加:
if (!self.cellAlreadyDidLoad)
{
[self cellDidLoad];
self.cellAlreadyDidLoad = YES;
}
现在你有一个方法,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.
}
}