繁体   English   中英

静态UITableView单元格属性修改

[英]Static UITableView Cell Property Modification

我的故事板上有一个静态的UITableView设置。 我已经对某些单元格进行了子类化并添加了此属性:

@property (nonatomic, strong) UILabel *label;

我也有代码将标签添加到layoutSubviews方法中的单元格中。 我的标签显示在我的单元中没有问题。 我可以看到标签上写着'PLACEHOLDER'的标签,但并未更新为表示我在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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    APInfoTableViewCell *cell = (APInfoTableViewCell*)[super tableView:tableView cellForRowAtIndexPath:indexPath];

[cell.infoLabel setText@"Hello World"];

return cell;
}

如果您正在使用情节initUI ,并且不想添加IB插座,请从awakeFromNib方法调用initUI方法。 如果不使用情节提要实现,则- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier方法,然后从那里调用它。

一旦从笔尖(从情节提要或xib)实例化了单元(或任何UIView子类),就会调用awakeFromNib方法。 并且它在视图的生命周期中仅被调用一次

注意:如果以编程方式创建视图子类,则不会调用此方法。

根据文档

子类可以根据需要重写此方法,以更精确地布局其子视图。 仅当子视图的自动调整大小和基于约束的行为没有提供所需的行为时,才应覆盖此方法。 您可以使用实现直接设置子视图的框架矩形。

就是说,使用此方法对已经添加的布局进行任何其他布局。 发生某些帧/自动布局约束更改时,将调用此方法。

您需要在tableView:cellForRowAtIndexPath:实例化一个新单元格,或使用dequeueReusableCellWithIdentifier: cellForRowAtIndexPath:返回表视图中可见的实例化单元格。 由于您没有在任何地方实例化单元格,因此表视图中没有单元格,因此cellForRowAtIndexPath:返回nil

另外, layoutSubviews被称为很多 ,被称为后期。 不应该依赖它来初始化标签。 就目前而言,当您调用layoutSubviews时,您的单元将继续添加其他标签! 指定的初始化程序是添加该initUI代码的地方(顾名思义是😉)。 如果您的UITableViewCell子类的视图未使用XIB / Storyboard,则initWithStyle:reuseIdentifier:是指定的初始化程序。 (否则,它是initWithCoder:awakeFromNib

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM