致命错误:在didDeselectRowAt

时间:2017-03-07 12:13:54

标签: ios swift uitableview

我对IOS开发完全陌生,并且一直坚持这个。我在这里尝试一个非常简单的事情,我希望当我在TableView中选择一个单元格时,它的背景颜色变为灰色,当我选择另一个单元格时,前一个灰色单元格的背景颜色应该是恢复为默认颜色。

为实现这一点,我使用以下代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{    
  let currentCell = tableView.cellForRow(at: indexPath) as! RoundTableViewCell
  currentCell.contentView.backgroundColor = Util.hexStringToUIColor(hex: "#d3d3d3")
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) 
{
  let currentCell = tableView.cellForRow(at: indexPath) as? RoundTableViewCell  // Error
  currentCell.contentView.backgroundColor = Util.hexStringToUIColor(hex: "#ffffff")    
}

上面的代码工作得很好,但是当我尝试点击一个新单元格时崩溃,而前一个选定单元格在表格视图中不可见,因为它被滚动了。我无法理解这里发生了什么。

修改

cellForRowAt

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{ 
   let cell: RoundTableViewCell = (tableView.dequeueReusableCell(withIdentifier: "cell")! as? RoundTableViewCell)!
   cell.contentView.backgroundColor = Util.hexStringToUIColor(hex: "#ffff     
   return cell
}

3 个答案:

答案 0 :(得分:2)

您需要检查细胞是否可用

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) 
{
   if let currentCell = tableView.cellForRow(at: indexPath) as? RoundTableViewCell  {
         currentCell.contentView.backgroundColor = Util.hexStringToUIColor(hex: "#ffffff")    
     }
}

答案 1 :(得分:1)

b

如果您想要多个小区选择。

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    ....
    ....
    if cell.isSelected == true {
       currentCell.contentView.backgroundColor = Util.hexStringToUIColor(hex: "#d3d3d3")     
    }
    else {
       currentCell.contentView.backgroundColor = Util.hexStringToUIColor(hex: "#ffffff")
    }
    ....
    ....
}

应用程序崩溃,因为当单元格从屏幕上消失时,它会从内存中释放出来,因此您获得了nil值。所以试试这个

table.allowsMultipleSelection = true

答案 2 :(得分:0)

使用以下代码获得预期结果。

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell


        cell.selectedBackgroundView = UIImageView()
        cell.backgroundView=UIImageView()

        let selectedBackground : UIImageView = cell.selectedBackgroundView as! UIImageView
        selectedBackground.image = UIImage.init(named:"selected.png");

        let backGround : UIImageView = cell.backgroundView as! UIImageView
        backGround.image = UIImage.init(named:"defaultimage.png");

        return cell


    }