我可以在UITableviewCell中使用viewDidLoad方法吗?
我可以在UITableviewCell
使用viewDidLoad
方法吗?
不,你不写在自定义单元格类的子类UITableViewCell(它是UIViewController的一部分)viewDidLoad。你有一个方法调用
-(void)layoutSubviews { [super layoutSubviews]; }
在那里你可以定义框架和所有的自定义单元格controls.Refer 苹果的UITableviewCell参考
但是请注意 ,viewDidLoad 只在对象的生命周期中被调用一次 ; 它就像一般的面向对象编程的初始化器。 但是,“layoutSubviews” 将在每个单元格上被多次调用 (取决于滚动等问题)。 意识到这一点非常重要,因为这会使viewDidLoad中的许多事情“通常会做”, 所以在layoutSubviews中无法做到这一点。
请注意,viewDidLoad仅被调用一次 :layoutSubviews 经常被调用。
这只是一个简单的function,如果你写它。
自定义单元格教程
最好还是打电话给super.layoutSubviews()
。 Swift语法:
override func layoutSubviews() { super.layoutSubviews() }
如果你试图初始化你的UITableViewCell的一些IBOutlets,你可能需要去awakeFromNib()调用:
override func awakeFromNib() { super.awakeFromNib() // Do your stuff // myIBOutlet.text = "Hello" }
UIKit函数viewDidLoad
是UIViewController的成员,而UITableViewCell不会inheritance它。 如果你愿意,你可以编写一个名为 viewDidLoad
的方法,但是它不会像在UIViewController子类中那样被调用。
是的,你可以在UITableViewCell
编写viewDidLoad
,但viewDidLoad
不是UITableViewCell
委托方法,所以它不会自动调用,所以你必须手动调用它[self viewDidLoad]
来执行你的代码。
您可以使用UITableViewCell或UICollectionViewCell的initWithFrame或UIView的任何子类。
- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialisation code here } return self; }
我意识到这是一个古老的线程,但我有时使用的模式(特别是如果我有我的自定义单元格的基类):
-
添加一个BOOL属性,称之为“cellAlreadyDidLoad”。 我这样命名,因为BOOL默认为NO,所以我不用担心在init方法中设置它。
-
创build一个cellDidLoad方法,它的名字是这样的,就像我们都知道和喜欢的viewDidLoad。
-
重写layoutSubviews方法并添加:
if (!self.cellAlreadyDidLoad) { [self cellDidLoad]; self.cellAlreadyDidLoad = YES; }
现在你有一个方法,cellDidLoad,只会被调用一次,知道UI元素(包括你的IBOutlets)将会出现。 非常像视图控制器上的viewDidLoad。