2016-02-06 83 views
0

我的表視圖具有按某些類型排序的一些元素:TypeA,TypeB和TypeC。根據按下哪個單元更改UITableViewCell選擇顏色

我希望當我用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時才使用標誌來做到這一點。
或者還有另一種方法來實現我所追求的?

+0

或者你可以把你改變顏色的邏輯時didSelectRowAtIndexPath方法實際上是選定的單元格即 –

回答

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

我這個問題是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! 
}