自定义UI TableViewCell选择了backgroundcolor swift

时间:2015-03-03 13:55:33

标签: swift uitableview selected

我正在尝试使用Swift更改自定义选定TableViewCell的外观。

我是否需要通过设计人员或以编程方式进行此操作?

我尝试了以下内容:

enter image description here

这是我的代码:

@IBOutlet var tableView: UITableView!


    var tableData: [String] = ["One", "Two", "Three", "Four"]

    override func viewDidLoad() {
        super.viewDidLoad()


        // Register custom cell
        var nib = UINib(nibName: "vwTblCell", bundle: nil)
        tableView.registerNib(nib, forCellReuseIdentifier: "cell")

    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.tableData.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell     {

        var cell:TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as TblCell

        cell.lblCarName.text = tableData[indexPath.row]
        cell.imgCarName.image = UIImage(named: tableData[indexPath.row])

        return cell

    }

    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
        println("Row \(indexPath.row) selected")
    }

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 70
    }

12 个答案:

答案 0 :(得分:19)

我有一个相似的问题。在 cellForRowAtIndexPath 方法集中:

cell.selectionStyle = .None

然后设置 didHighlightRowAtIndexPath ...

func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
    let cell  = tableView.cellForRowAtIndexPath(indexPath)
    cell!.contentView.backgroundColor = .redColor()
}

func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
        let cell  = tableView.cellForRowAtIndexPath(indexPath)
        cell!.contentView.backgroundColor = .clearColor()
}

答案 1 :(得分:14)

我的两分钱:正确的做法(在视觉上)是使用(tableView)单元格中的指定视图,即selectedBackgroundView属性。但是,您需要首先使用UIView()

对其进行初始化

SWIFT 3.0

override func awakeFromNib() {
    super.awakeFromNib()
    self.selectedBackgroundView = UIView()
    self.selectionStyle = .default // you can also take this line out
}

然后您可以在自定义单元格中使用它,如下所示:

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    self.selectedBackgroundView!.backgroundColor = selected ? .red : nil
}

那就是它。当然,您也可以将上面的内容集成到上面提到的UITableView函数中。看看吧。

答案 2 :(得分:13)

您已经拥有正确的方法:didSelectRowAtIndexPath。在该方法中,您可以调用tableView.cellForRowAtIndexPath(indexPath)并获取您的单元格。您可以将单元格背景设置为您的颜色:

 func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
        println("Row \(indexPath.row) selected")
        let cell:YourCustomCell = tableView.cellForRowAtIndexPath(indexPath) as YourCell
        cell.backgroundColor = UIColor.redColor()
    }

或者,更好的方法是检查cellForRowAtIndexPath方法,如果选择了一个单元格:

if(cell.selected){
  cell.backgroundColor = UIColor.redColor()
}else{
  cell.backgroundColor = UIColor.clearColor()
}

答案 3 :(得分:13)

  

更新 Swift 3

此答案基于曹勇答案,旨在更新 Swift 3

对于 Swift 3 ,请在 cellForRowAt indexPath 方法集中使用以下代码:

Dxyy

然后,将其设置为 didHighlightRowAtIndexPath

cell.selectionStyle = .none

答案 4 :(得分:6)

点击单元格时,实际上正在更改子视图背景颜色。该子视图是'selectedBackgroundView'。您可以覆盖cellForRowAtIndexPath TableView委托方法中每个单元格的视图。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

   let cell = tableView.dequeueReusableCellWithIdentifier("identifier", forIndexPath: indexPath) 

   let selectedView = UIView()
   selectedView.backgroundColor = UIColor(red: 250/255, green: 250/255, blue:     250/255, alpha: 1.0)
   cell.selectedBackgroundView = selectedView

   return cell
}

将颜色更改为您喜欢的颜色。

答案 5 :(得分:5)

为了保持代码清洁,您应该考虑将您的单元格的屏幕设计相关代码从UITableViewController移动到UITableViewCell类。

您的UITableViewController`只需按如下方式设置单元格的选定状态:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    guard let cell = tableView.cellForRow(at: indexPath) else { return }
    cell.setSelected(true, animated: true)
}

您可以通过覆盖UITableViewCell在已成功的var isSelected课程中实施所需的自定义。使用此解决方案,您可以为每个单元格选择不同的颜色。

class MyTableViewCell: UITableViewCell
{
    @IBOutlet weak var label:UILabel!

    override var isSelected: Bool
    {
        didSet{
            if (isSelected)
            {
                self.backgroundColor = UIColor.red
                if let label = label
                {
                    label.textColor = UIColor.white
                }
            }
            else
            {
                self.backgroundColor = UIColor.white
                if let label = label
                {
                    label.textColor = UIColor.black
                }
            }
        }
    }
}

答案 6 :(得分:1)

对于tableView ==

首次调用此方法 -

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
        cell.textLabel?.text = "Show Label"
        cell.backgroundColor = UIColor.redColor()

    }

而不是调用此方法

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
        cell.backgroundColor = UIColor.clearColor()
    }

对于CollectionView ==

<强> 1 -

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        let cell = dateCollectionView.cellForItemAtIndexPath(indexPath) as! DateCollectionViewCell
            cell!.dateLabel.backgroundColor = UIColor.redColor()

 }  

<强> 2 -

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
        let cell = dateCollectionView.cellForItemAtIndexPath(indexPath) as? DateCollectionViewCell
        cell!.dateLabel.backgroundColor = UIColor.clearColor()
    }

答案 7 :(得分:1)

SWIFT 5更新

CRON方法中将选择样式设置为.none:

cellForRowAT

然后实现func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell cell.selectionStyle = .none return cell } didHighlightRowAt方法:

didUnhighlightRowAt

答案 8 :(得分:0)

正确的方法(更加自然和自然):

override func awakeFromNib() {
    super.awakeFromNib()
    selectedBackgroundView = UIView()
    selectedBackgroundView?.backgroundColor = .blue
}

为什么其他方法错误:

  1. 突出显示解决方案:未选中突出显示。高光不会像选择一样进行动画处理。感觉不像正常的选择那样自然
  2. 因为iOS为我们处理了动画,所以无需通过setSelected方法更改selectedBackgroundView的颜色。
  3. 设置backgroundColor的行为也不同于iOS的行为

答案 9 :(得分:0)

 @Autowired
    private MockMvc mockMvc;


    @MockBean
    InformationUtileService informationUtileService;

    @MockBean
    UserService userService;

    ObjectMapper mapper = new ObjectMapper();

    @Test
    public void givenInformationsUtiles_whenGetInfoUtiles_thenReturnJsonArray()
            throws Exception {

        InformationUtile informationUtile = new InformationUtile();
        informationUtile.setId(1);
        informationUtile.setContent("oumaima");
        informationUtile.setDescription("test");
        Media medias = new Media();
        medias.setType("image/png");
        medias.setUrl("C:\\files\\actualite\\32769\\adobexd.png");
        List<Media> allMedias = new ArrayList<Media>();
        allMedias.add(medias);
        informationUtile.setMedias(allMedias);
        OngoingStubbing<User> user = Mockito.when(userService.getUser(Mockito.anyLong())).thenReturn(new User());
        Mockito.when(informationUtileService.addOrEditInfoUtile(Mockito.any(InformationUtile.class))).thenReturn(informationUtile);
        mockMvc.perform(post("/infoUtile/add/{id}",informationUtile.getId())
                .contentType(MediaType.APPLICATION_JSON)
                .content(mapper.writeValueAsBytes(informationUtile)))
                .andExpect(status().isOk());

    }

答案 10 :(得分:-1)

以上答案均无用,因此我尝试了我的方法,并成功了: 这里是:-

  1. 在您的单元格中创建这样的功能。
func reloadcell() {
    if isSelected {
        conView.backgroundColor = .yellow
    } else if isHighlighted {
        conView.backgroundColor = .yellow
    } else {
        conView.backgroundColor = .clear
    }
}

并在layoutsubviews和didselect方法中调用该函数

答案 11 :(得分:-1)

在您的 cellForRowAtIndexPath 方法集中:

cell.selectionStyle = .none

然后像这样设置 didHighlightRowAtIndexPath...

func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {
    let cell  = tableView.cellForRow(at: indexPath)
    cell!.contentView.backgroundColor = .green
}