2016-02-06 2 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 ViewView.

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() 
} 

EDIT: Если вы создали 3 различных типов класса клеток проверки Tableview класса типа клеток и изменить цвет в didHighlightRowAtIndexPath метода.

1

Моя проблема с этим состоит в том, что willDisplayCell вызывается, когда я начинаю приложение и мой источник данных пуст, поэтому я получаю фатальную ошибку.

tableView(_:willDisplayCell:forRowAtIndexPath:)10 будет вызываться только в том случае, если ваш источник данных сообщает табличному представлению о наличии строк для отображения. Таким образом, проблема скорее состоит в том, что ваш метод 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! 
} 
Смежные вопросы