UITableViewCell setSelected:animated:not working

Ram*_*sel 21 cocoa-touch objective-c uitableview

这真让我抓狂.我在这里看过SO,因为我认为这是一个简单的答案,但找不到一个.

在我的自定义中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];
}
Run Code Online (Sandbox Code Playgroud)

tableView:cellForRowAtIndexPath:控制器中:

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

        [cell setSelected:YES];
    }
Run Code Online (Sandbox Code Playgroud)

我已插入断点并selected == YES正在传递正确的单元格,并且if语句正在执行时应该是,但文本永远不会被设置为blackColor.

Dre*_*w C 63

要使单元格显示为已选中,您必须-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
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特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
    }
}
Run Code Online (Sandbox Code Playgroud)

-setSelected从其他任何地方打电话都没有效果.

为什么?在初始化或出列单元格之后,但在显示单元格之前,表格视图会调用一个名为的私有方法,该方法-_configureCellForDisplay:forIndexPath:将单元格的selected属性设置为NO.willDisplayCell:forRowAtIndexPath:在此之后调用委托,让您设置显示所需的任何内容.

  • 非常重要的是,我们还需要调用`tableView.selectRowAtIndexPath(indexPath,animated:false,scrollPosition:.Top)`否则该单元变得不可选(委托不响应`tableView:didDeselectRowAtIndexPath`或`tableView: didSelectRowAtIndexPath`) (6认同)
  • 有关tableview单元如何工作的重要信息! (2认同)

Fra*_*tin 48

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

Objective-C的

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
Run Code Online (Sandbox Code Playgroud)

迅速4

tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
Run Code Online (Sandbox Code Playgroud)