我的故事板中有静态TaskScheduler
设置。我已经将一些单元格子类化并添加了这个属性:
UITableView
我还有代码在@property (nonatomic, strong) UILabel *label;
方法中将标签添加到我的单元格中。我的标签显示在我的单元格中没有问题。我可以看到标签上写着' PLACEHOLDER'但我没有更新说明我在layoutSubviews
中设置的文字。
在cellForRowAtIndexPath
方法中,我有以下内容:
cellForRowAtIndexPath
但是,这不会更新我标签中的文字。标签实际上是零。
编辑:
这是完整的代码......
APInfoTableViewCell *cell = (APInfoTableViewCell*)[super tableView:tableView cellForRowAtIndexPath:indexPath];
[cell.label setText@"Hello World"];
子类:
UITableViewCell
@property (nonatomic, strong) UILabel *infoLabel;
-(void)layoutSubviews
{
[super layoutSubviews];
[self initUI];
}
-(void)initUI
{
//add long press to show info label
_infoLabel = [UILabel new];
[_infoLabel setText:@"PLACEHOLDER"];
[_infoLabel setFont:[UIFont fontWithName:@"Avenir-Medium" size:10.0f]];
[_infoLabel setTextAlignment:NSTextAlignmentCenter];
[_infoLabel setTextColor:[UIColor apText]];
[_infoLabel setAlpha:1.0f];
[_infoLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:_infoLabel];
NSArray *infoConstraintH = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-40-[infoLbl]-40-|" options:0 metrics:nil views:@{ @"infoLbl" : _infoLabel }];
[self addConstraints:infoConstraintH];
NSArray *infoConstraintV = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[infoLbl]-10-|" options:0 metrics:nil views:@{ @"infoLbl" : _infoLabel }];
[self addConstraints:infoConstraintV];
}
:
ViewController
答案 0 :(得分:1)
如果您使用的是故事板,并且您不想添加IB插座,请从initUI
方法调用awakeFromNib
方法。
如果您没有使用storyboard实现- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
方法并从那里调用它。
一旦从nib(来自storyboard或xib)实例化单元格(或任何UIView子类),就会调用awakeFromNib方法。它在视图的生命周期中只调用一次
注意:如果以编程方式创建视图子类,则不会调用此方法。
根据文件
子类可以根据需要覆盖此方法,以执行其子视图的更精确布局。仅当子视图的自动调整大小和基于约束的行为不提供所需的行为时,才应覆盖此方法。您可以使用实现直接设置子视图的框架矩形。
这意味着,使用此方法进行已添加的任何其他布局。当某些帧/自动布局约束发生变化时,将调用此方法。
答案 1 :(得分:0)
您需要在tableView:cellForRowAtIndexPath:
中实例化新单元格或使用dequeueReusableCellWithIdentifier:
。 cellForRowAtIndexPath:
返回表视图中可见的实例化单元格。由于您没有在任何地方实例化单元格,因此表格视图中没有单元格,因此cellForRowAtIndexPath:
会返回nil
。
此外layoutSubviews
被称为很多,并被称为迟到。您不应该依赖它来初始化您的标签。在您调用layoutSubviews
时,您的单元格将继续添加其他标签!指定的初始化程序是添加initUI
代码的地方(顾名思义)。如果您的UITableViewCell
子类未在其视图中使用XIB / Storyboard,则initWithStyle:reuseIdentifier:
是指定的初始化程序。 (否则为initWithCoder:
或awakeFromNib
)