根据按下的单元格更改UITableViewCell选择颜色

时间:2016-02-06 14:40:51

标签: ios swift tableview

我的表视图包含一些按类型排序的元素:TypeA,TypeB和TypeC。

我希望当我点击带有TypeA的单元格将选择颜色更改为红色时,当我在TypeB上键入以将颜色更改为蓝色时以​​及按下TypeC时将颜色更改为黄色。

现在我想出了这段代码:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    guard let mode = dataSource.selectedObject else {
        fatalError("willDisplayCell, but no selected row?")
    }

    let type = ModeType(rawValue: mode.type)!
    let selectionColor = UIView() as UIView
    selectionColor.backgroundColor = type.color()
    cell.selectedBackgroundView = selectionColor
}

我的问题是,当我启动应用程序并且我的数据源为空时调用willDisplayCell,因此我收到致命错误。

我怎样才能克服这一点?也许只有在调用didSelectRowAtIndexPath时才使用标志来执行此操作 还是有另一种方法可以实现我的目标吗?

2 个答案:

答案 0 :(得分:2)

我假设您已经创建了自定义UITableviewCell。创建一个单元格类型枚举。

 enum CellType {
   case RedCell
   case Yellowcell
   case OrangeCell
 }
 //Create enum property
 class CustomCell : UITableViewCell {
   var cellType:CellType = CellType.RedCell //Default is RedCell
 }

现在您必须在ViewController tableview数据源中指定单元格类型。

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  {
    var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell") as! CustomCell
    cell.cellType = .RedCell //your choice
    return cell
}

override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}

override func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
var cell = tableView.cellForRowAtIndexPath(indexPath)
switch(cell.cellType) { 
  //Handle Switch case
  case .RedCell:
       cell?.contentView.backgroundColor = UIColor.redColor()
       cell?.backgroundColor = UIColor.redColor()

 }

}

 override func tableView(tableView: UITableView,       didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
var cell = tableView.cellForRowAtIndexPath(indexPath)
// Set unhighlighted color
cell?.contentView.backgroundColor = UIColor.blackColor()
cell?.backgroundColor = UIColor.blackColor()
 }

修改:  如果您已创建3种不同类型的单元格类检查tableview单元格类型并更改 didHighlightRowAtIndexPath 方法中的颜色。

答案 1 :(得分:1)

  

我的问题是当我启动时会调用willDisplayCell   应用程序和我的数据源是空的,所以我得到一个致命的错误。

仅当您的数据源告诉表视图有要显示的行时,才会调用

tableView(_:willDisplayCell:forRowAtIndexPath:)。所以问题更可能是当您的数据源为空时,您的tableView(_:numberOfRowsInSection:)方法返回的数字大于零。

此外,您的代码看起来只需要为所选行调用tableView(_:willDisplayCell:forRowAtIndexPath:)。它会被调用所有显示的行。但是这种方法不必影响背景颜色。事实上,它在大多数应用程序中很少使用。只有少数边缘情况需要在显示之前弄乱单元格。

设置选择背景颜色的正确方法是创建UIView并将其分配给单元格的selectedBackgroundView属性。您可以从单元格的子类(对于复杂单元格首选)或从tableView:cellForRowAtIndexPath:数据源方法执行此操作:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("MyCell")
    cell!.textLabel?.text = "Kilroy was here."
    cell!.selectedBackgroundView = UIView(frame: cell!.bounds)
    cell!.selectedBackgroundView!.backgroundColor = .greenColor()
    return cell!
}