我能在UITableviewCell
中使用viewDidLoad
方法吗?
-(void)layoutSubviews
{
[super layoutSubviews];
}
你可以在其中定义自定义单元格控件的框架和其他内容。请参考苹果的UITableviewCell参考文献
需要注意的是,'viewDidLoad'方法在对象的生命周期中仅被调用一次,它类似于面向对象编程中的初始化器。然而,'layoutSubviews'方法会被多次调用(取决于滚动等问题)在每个单元格上。重要的是要意识到,由于这个原因,许多通常在viewDidLoad中执行的任务,你不能在layoutSubviews中进行。
如果你写一个简单的函数,它就可以了。
如果您想初始化UITableViewCell的一些IBOutlets,您可以尝试使用awakeFromNib()方法:
override func awakeFromNib() {
super.awakeFromNib()
// Do your stuff
// myIBOutlet.text = "Hello"
}
awakeFromNib
确实看起来是最接近 viewDidLoad
的东西。 - Skouasuper.layoutSubviews()
。Swift 语法:override func layoutSubviews() {
super.layoutSubviews()
}
awakeFromNib()
和viewDidLoad()
类似,它们都是用于初始化的方法。但是awakeFromNib()
不会像viewDidLoad()
那样频繁地运行,初始化命令必须在其中调用。
layoutSubviews()
类似于viewWillAppear()
,所以当您想要更改视图显示时应该调用它。例如,当用户更改手机方向并且应用程序需要更新一些特定配置(如大小、颜色和位置)时。
关于awakeFromNib()
方法,苹果公司的文档如下:
在您自己的awakeFromNib方法中随时调用超级实现。摘要
从Interface Builder存档或nib文件中加载完成后,准备接收服务。
声明
func awakeFromNib()
讨论 nib加载基础设施会向从nib存档重建的每个对象发送awakeFromNib消息,但只有在存档中的所有对象都已加载和初始化之后才会发送此消息。当对象接收到awakeFromNib消息时,可以保证其所有输出口和动作连接已经建立。
您必须调用awakeFromNib的超级实现,以使父类有机会执行任何其他所需的初始化。虽然此方法的默认实现什么也不做,但许多UIKit类提供非空实现。您可以实现自己的awakeFromNib方法或使用父类中的实现。
viewDidLoad
是UIViewController的一个成员函数,而UITableViewCell并没有继承它。如果需要,你可以编写一个名为viewDidLoad
的方法,但它不会像在UIViewController子类中那样被调用。
cellForRowAtIndex
代理方法请求一个自定义单元格。 如果能更多地了解您要做什么将会非常有帮助。 - borrrden我知道这是一个老旧的话题,但有时我会使用以下模式(特别是如果我的自定义单元格有一个基类):
Add a BOOL property, call it something like "cellAlreadyDidLoad". I named it that way because BOOL will default to NO, so I don't have to worry about setting it in an init method.
Create a cellDidLoad method, named so with the intent that it's kind of like the viewDidLoad that we all know and love.
Override the layoutSubviews method and add:
if (!self.cellAlreadyDidLoad)
{
[self cellDidLoad];
self.cellAlreadyDidLoad = YES;
}
现在你有了一个方法,cellDidLoad,它只会被调用一次,知道UI元素(包括你的IBOutlets)将被呈现。非常像视图控制器上的viewDidLoad。
var stickers:[Sticker]? {
didSet {
if let stickers = stickers {
//do some initialisation
}
}
}
initWithCoder()
和awakeFromNib()
方法(按相同的顺序)。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]
手动调用它来执行你的代码。
你可以在UITableViewCell或UICollectionViewCell或任何UIView的子类中使用initWithFrame。
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialisation code here
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
或- (void)awakeFromNib
来进行初始化。 - Shabeer Ali