单元格的accessoryType属性正在设置但在单元格重用期间未被遵守

时间:2014-08-13 03:36:38

标签: ios uitableview

我正在创建UITableView,其中某些单元格的accessoryType属性设置为UITableViewCellAccessoryCheckmark。这适用于UITableView的初始加载,但在单元重用期间会崩溃。附件未显示在某些单元格上。我调试了代码并进行了验证,当dataSource调用cellForRowAtIndexPath作为单元重用的一部分时,accessoryType属性被设置为正确的值。

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator中返回单元格之前,我甚至尝试使用cellForRowAtIndexPath内的硬编码。这会在第一次装载时将附件设置为公开指示器,但在重复使用时会丢失,即使在硬编码时也是如此。

这感觉就像一个基本的细胞重用问题,但我觉得我已经覆盖了我的所有基础,以确保它不是一个愚蠢的错误。

UITableViewDataSource代码

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.puzzles.count;
}

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    PuzzleListCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kPuzzleListIdentifier
                                                            forIndexPath:indexPath];

    PuzzleListItem *item = self.puzzles[indexPath.row];
    [self.puzzleListItemCellPresenter presentCell:cell forItem:item];
    return cell;
}

相关的viewDidLoad代码段

self.tableView.dataSource = self;   
UINib *nib = [UINib nibWithNibName:@"PuzzleListCell" bundle:[NSBundle mainBundle]];
[self.tableView registerNib:nib forCellReuseIdentifier:kPuzzleListIdentifier];

恼人的详细方法presentCell:forItem:

- (void)presentCell:(PuzzleListCell *)cell forItem:(PuzzleListItem *)listItem;
{
    cell.nameLabel.text = listItem.name;
    cell.puzzleStyleLabel.text = listItem.puzzleType == PuzzleTypeSliding ? @"Sliding" : @"Choosing";

    if (listItem.puzzleListItemType == PuzzleListItemTypeSent) {
        cell.backgroundColor = [UIColor grayColor];
        UIFontDescriptor * italicDescriptor = [cell.nameLabel.font.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
        cell.nameLabel.font = [UIFont fontWithDescriptor:italicDescriptor size:0];
        cell.nameLabel.textColor = [UIColor whiteColor];
        cell.puzzleStyleLabel.textColor = [UIColor whiteColor];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        UIFontDescriptor * descriptor = [cell.nameLabel.font.fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitUIOptimized];
        cell.nameLabel.font = [UIFont fontWithDescriptor:descriptor size:0];

        if (listItem.played)
        {
            cell.nameLabel.textColor = [UIColor grayColor];
            cell.puzzleStyleLabel.textColor = [UIColor grayColor];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
        else
        {
            cell.nameLabel.textColor = [UIColor blackColor];
            cell.puzzleStyleLabel.textColor = [UIColor blackColor];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }
    }
}

修改

发现了这个问题。我意识到这可能是我自定义单元格中的一个问题。

我的细胞'唯一方法是layoutSubviews,我显然删除了对[super layoutSubviews]的调用。

1 个答案:

答案 0 :(得分:0)

问题不在于任何控制器代码。问题出在我的自定义单元类中。我没有打电话给[super layoutSubviews]。这完全可以理解为什么配件会丢失,因为它可能是超类的子视图

#import "PuzzleListCell.h"

@implementation PuzzleListCell

- (void)layoutSubviews 
{
    [super layoutSubviews];
    [self.puzzleStyleLabel sizeToFit];
    [self.nameLabel sizeToFit];
}
@end