UITableViewCell setSelected:animated:not working

时间:2014-03-27 20:28:40

标签: objective-c cocoa-touch uitableview

这让我发疯了。我在这里看过S.O.因为我认为这是一个简单的答案,但无法找到答案。

在我的自定义UITableViewCell中:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{   
    // Configure the view for the selected state
    if (selected) {        
        [self.languageLevelNameLabel setTextColor:[UIColor blackColor]];        
    }
    else {        
        [self.languageLevelNameLabel setTextColor:[UIColor colorMessageCountZero]];
    }

    [self setNeedsDisplay];
}

在控制器的tableView:cellForRowAtIndexPath:中:

 if ([level integerValue] == indexPath.row) {

        [cell setSelected:YES];
    }

我已插入断点,selected == YES正在为正确的单元格传递,if语句正在执行,但文本永远不会设置为{{ 1}}。

4 个答案:

答案 0 :(得分:60)

要让单元格显示为已选中,您必须在-setSelected:animated:内调用-tableView:willDisplayCell:forRowAtIndexPath:,如下所示:

目标C:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (/* should be selected */) {
        [cell setSelected:YES animated:NO];
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];  // required, as noted below
    }
}

斯威夫特3:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if (/* should be selected */) {
        cell.setSelected(true, animated: false)
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)  // required, as noted below
    }
}

从其他地方拨打-setSelected无效。

为什么呢? 在初始化或出列单元格之后,但在显示单元格之前,表格视图会调用名为-_configureCellForDisplay:forIndexPath:的私有方法,该方法除了其他功能外,还将单元格的selected属性设置为NO。代理人willDisplayCell:forRowAtIndexPath:在此之后被调用,允许您设置显示所需的任何内容。

答案 1 :(得分:46)

如果要将单元格设置为选中,请在表格视图的cellForRowAtIndexPath方法中使用此方法selectRowAtIndexPath:animated:scrollPosition:

目标-C

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

swift 4

tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)

答案 2 :(得分:0)

尝试

NSIndexPath* selectedCellIndexPath= [NSIndexPath indexPathForRow:number_row  inSection:0];
[self tableView:tableViewList didSelectRowAtIndexPath:selectedCellIndexPath];
[tableViewList selectRowAtIndexPath:selectedCellIndexPath animated:YES scrollPosition:UITableViewScrollPositionTop];

答案 3 :(得分:0)

没有必要调用cell的setSelected方法.Apple希望我们通过两个函数设置单元格的选择状态,一个是didSelectRowAtIndexPath,另一个是didDeselectRowAtIndexPath,它们总是成对出现。为了解决这个问题,我们只调用两个函数:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

[self tableView:self.leftTableView didSelectRowAtIndexPath:indexPath];
[self.leftTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];