我正在创建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]
的调用。
答案 0 :(得分:0)
问题不在于任何控制器代码。问题出在我的自定义单元类中。我没有打电话给[super layoutSubviews]
。这完全可以理解为什么配件会丢失,因为它可能是超类的子视图
#import "PuzzleListCell.h"
@implementation PuzzleListCell
- (void)layoutSubviews
{
[super layoutSubviews];
[self.puzzleStyleLabel sizeToFit];
[self.nameLabel sizeToFit];
}
@end