选定的UITableViewCell上突出显示不一致

时间:2013-12-12 16:01:28

标签: ios uitableview

我有UITableView,如果数据模型表明单元格代表项目列表中的选定选项,我需要以编程方式选择单元格。我在配置UITableViewCell

时执行此操作
if (group == self.theCase.assignedGroup) {
    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
    self.selectedIndexPath = indexPath;
} else {
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

我看到非常奇怪的行为。如果tableview的第一行是应该选择的那一行,则单元格不会正确突出显示其背景。但是,如果第二行是应该选择的那一行,它可以正常工作(最后截图)。

UPDATE :这可能与我正在异步加载表的数据这一事实有关,而且在加载数据时,我会显示一个不同类型的单元格,其中包含一个进度指示器第一排。以下是处理此问题的表视图数据源代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section
{
    if (self.hasMorePages) {
        return self.groups.count + 1;
    }
    return self.groups.count;
}

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

    if (indexPath.row < self.groups.count) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"DSAssignCell" forIndexPath:indexPath];
        [self configureCell:cell forRowAtIndexPath:indexPath];
    } else {
        cell = [tableView dequeueReusableCellWithIdentifier:@"DSLoadingCell" forIndexPath:indexPath];
        [self configureLoadingCell:cell forRowAtIndexPath:indexPath];
    }

    return cell;
}

- (void)configureCell:(UITableViewCell *)cell
    forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DSGroup *group = self.groups[indexPath.row];
    if (group == self.theCase.assignedGroup) {
        [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
        self.selectedIndexPath = indexPath;
    } else {
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    cell.textLabel.text = group.name;
    cell.tag = kDataCellTag;
}

- (void)configureLoadingCell:(UITableViewCell *)cell
           forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIActivityIndicatorView *activityIndicator;
    if ([cell viewWithTag:kActivityIndicatorTag]) {
        activityIndicator = (UIActivityIndicatorView *)[cell viewWithTag:kActivityIndicatorTag];
    } else {
        activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        activityIndicator.center = cell.center;
        activityIndicator.tag = kActivityIndicatorTag;
        [cell.contentView addSubview:activityIndicator];
    }
    [activityIndicator startAnimating];
    cell.tag = kLoadingCellTag;
}

UPDATE 根据要求,以下是处理群组异步加载的代码。来自Web服务的代理数据:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self resetData];
    [self loadData];
}

- (void)resetData
{
    self.currentPage = 0;
    self.hasMorePages = YES;
    self.groups = [[NSMutableArray alloc] initWithCapacity:kGroupsPerPage];
    self.agents = [[NSMutableArray alloc] initWithCapacity:kAgentsPerPage];
}

- (void)loadData
{
    if (self.showingGroups) {
        [DSGroup fetchGroupsOnPage:self.currentPage + 1 perPage:kGroupsPerPage success:^(NSArray *groups, NSDictionary *links, NSNumber *totalEntries) {
            [self.groups addObjectsFromArray:groups];
            [self didLoadDataPage:(links[@"next"] != [NSNull null])];
        } failure:^(NSError *error) {
            [self showAlert:@"Could not load groups. Please try again later." withError:error];
        }];
    } else {
        [DSUser fetchUsersOnPage:self.currentPage + 1 perPage:kAgentsPerPage success:^(NSArray *users, NSDictionary *links, NSNumber *totalEntries) {
            [self.agents addObjectsFromArray:users];
            [self didLoadDataPage:(links[@"next"] != [NSNull null])];
        } failure:^(NSError *error) {
            [self showAlert:@"Could not load users. Please try again later." withError:error];
        }];
    }    
}

- (void)didLoadDataPage:(BOOL)hasMorePages
{
    self.hasMorePages = hasMorePages;
    self.currentPage++;
    [self.tableView reloadData];
}

以下是尝试选择(并突出显示)第一行的屏幕截图,这是错误的(没有灰色背景): Trying to select row 0

以下是尝试选择(并突出显示)第二行的屏幕截图,这是正确的: [Trying to select row 1

知道这里可能会发生什么吗?

1 个答案:

答案 0 :(得分:1)

我无法使用UITableViewCell的内置选择样式修复此问题,但是对其进行子类化并覆盖setSelected:animated修复它:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
     [super setSelected:selected animated:animated];

     self.contentView.backgroundColor = selected ? [UIColor grayColor] : [UIColor whiteColor];
}