Tableview和自定义单元格无法预测的行为

时间:2016-11-08 05:26:22

标签: ios objective-c uitableview

我有一个带自定义单元格的tableview控制器。对于每种类型的单元格,我在故事板和类中创建了一个原型单元。

这是其中一个单元格:

enter image description here

单元格有一个包含数字的圆形按钮。

我试图在我的cellForRowAtIndexPath方法中修改数字的值,如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     if (indexPath.row == 0) {
         TrackMilstoneCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TrackMilstoneCell"];
         if (cell == nil) {
             cell = [[TrackMilstoneCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TrackMilstoneCell"];
         }
         cell.backgroundColor = cell.contentView.backgroundColor;
         cell.milestoneNumber.backgroundColor = UIColorFromRGB(0xA875E1);
         [cell.milestoneNumber.titleLabel setText:@"2"];

         return cell;
     } ...

但是,我的行为非常不可预测。每次重新加载tableview时,我有时会得到1(故事板中的默认值),有时候会得到2(这就是我想要的)。

enter image description here

这是我的(TrackMilstoneCell)类的代码:

#import "TrackMilstoneCell.h"

@implementation TrackMilstoneCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)layoutSubviews
{
    [self viewSetup];
}

-(void)viewSetup
{

    self.milestoneNumber.layer.masksToBounds = NO;
    self.milestoneNumber.layer.borderColor = [UIColor whiteColor].CGColor;
    self.milestoneNumber.layer.borderWidth = 4;
    self.milestoneNumber.layer.cornerRadius = self.milestoneNumber.bounds.size.width / 2.0;

}

- (void)awakeFromNib
{
    // Initialization code
    [super awakeFromNib];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    // Configure the view for the selected state
}



@end

3 个答案:

答案 0 :(得分:1)

问题在于可重用性,所以这里最好的解决方案是在prepareForReuse方法中重置标签,如下所示:

- (void)prepareForReuse {
  [super prepareForReuse];
  [self.milestoneNumber setTitle:@"" forState:UIControlStateNormal];
}

在配置单元格时,将标题设置为:

[self.milestoneNumber setTitle:@"2" forState:UIControlStateNormal];

答案 1 :(得分:0)

我认为您应该在awakeFromNib中设置按钮的默认阶段。 在自定义表格视图单元格类中:

- (void)awakeFromNib
{
    // Initialization code
    [super awakeFromNib];

    self.milestoneNumber.titleLabel.text = @"";
}

答案 2 :(得分:0)

kaushal的建议成功了!

而不是像这样设置标题:

[cell.milestoneNumber.titleLabel setText:@"2"]

我做了:

[cell.milestoneNumber setTitle:@"2" forState:UIControlStateNormal];

现在它的工作正常。虽然我不确定为什么。