У меня есть таблица в которой по нажатию на строку она (строка) должна менять цвет (“выбираться”).
Технически это получилось сделать при помощи
var selectedCell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
selectedCell.contentView.backgroundColor = UIColor.redColor()
Но когда я нажимаю на другую строку, то предыдущая возвращается в первоначально состояние. Как можно реализовать множественный выбор?
Смена цвета выбранной строки таблицы
А может вам вставить в ячейку пустую вьюху и уже ей закрашивать бекграунд при нажатии на ячейку таблицы?
Я создал кастомную ячейку, добавил в неё вьюху и создал в классе ячейки аутлет. В didSelectRowAtIndexPath я вызываю этот вью и присваиваю ему цвет, но ничего не меняется по нажатию
let cell: AlcoholCell = self.alcoholTable.dequeueReusableCellWithIdentifier("cell") as! AlcoholCell
cell.chooseView.backgroundColor = UIColor.greenColor()
Класс кастомной строки
import UIKit
class AlcoholCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBOutlet var chooseView: UIView!
@IBOutlet var alcoLabel: UILabel!
@IBOutlet var alcoDegree: UILabel!
}
Это в классе с таблицей уже
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell: AlcoholCell = self.alcoholTable.dequeueReusableCellWithIdentifier("cell") as! AlcoholCell
cell.chooseView.backgroundColor = UIColor.greenColor()
switch alcoChoose[indexPath.row] {
case 0:
alcoChoose[indexPath.row] = indexPath.row + 1
case indexPath.row + 1:
alcoChoose[indexPath.row] = 0
default:
"error"
}
}
Ну и в identity inspector везде добавлены классы
Вы создаете ячейку совсем не в том методе. Так должно быть
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: AlcoholCell = tableView.dequeueReusableCellWithIdentifier("cell") as! AlcoholCell
cell.chooseView.backgroundColor = UIColor.greenColor()
switch alcoChoose[indexPath.row] {
case 0:
alcoChoose[indexPath.row] = indexPath.row + 1
case indexPath.row + 1:
alcoChoose[indexPath.row] = 0
default:
"error"
}
return cell
}
Так они все получаются покрашенными в зеленый цвет, а надо только те, на которые я нажимаю. Поэтому и решил, что надо в didSelectRowAtIndexPath
Ну так теперь используйте этот метод
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
cell.chooseView.backgroundColor = UIColor.blueColor()
}
Просто небольшая предыстория к приложению:
Может тут есть студенты или бывшие студенты ФТК Санкт-Петербургского Политеха. Есть там препод по программированию, Хлопин С. В., и гуляет по факультету легенда (которую он не отрицает), что единственная программа, которую он написал за свою жизнь - это алкогольный калькулятор для расчета спиртного на компанию. И мы поспорили с ним на отлично за экзамен, что я смогу не хуже сделать
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath) as! AlcoholCell
cell.chooseView.backgroundColor = UIColor.blueColor()
}
Да, сейчас меняет цвет, спасибо вам большое. А вы не знаете, как можно сделать, чтобы можно было так менять цвет у нескольких ячеек? Просто сейчас, выбирая другую, я предыдущей цвет скидывается на белый. Я пробовал через массив записывать индексы строк, ктоторые используются и менять цвет в зависимости от того, чему равен индекс в массиве, но всё равно не получается
Можете добавить вот такой код
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath) as! TableViewCell
cell.viewView.backgroundColor = UIColor.blackColor()
}
Можно подойти немного по другому.
Создать дополнительный массив bool элементов который будет отслеживать состояние ячейки.
Когда создаёте ячейку даёте окрас нужный проверяя свой массив.
Естественно, постоянно придётся делать reload table, чтобы таблица заново прорисовывалась, после нажатий различных.
Массив будет задаваться в didSelect, да впрочем где угодно.
Рекомендую повнимательнее изучить иерархию вьюх в UITableViewCell и обратить внимание на selectedBackgroundView
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewCell_Class/index.html#//apple_ref/occ/instp/UITableViewCell/selectedBackgroundView
Эта вьюха активная в тот момент, когда ячейка selected. Соответственно если вы в инициализации самой ячейки создадите вьюху с зеленом фоном и присвоете ее selectedBackgroundView, то получите то, что хотите.
А насчет множественного выделения, за это отвечает allowsMultipleSelection у UITableView
Можно костыльным способом. создаете массив булевых значений например
var otvetBool: [Bool] = [ false , false , false , false , false ]
при нажатии на cell делаем :
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
otvetBool[indexPath.row] = true
tableView.reloadData()
}
а в функции:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if (otvetBool[indexPath.row]){
cell.textLabel?.textColor = UIColor.purple
}else{
cell.textLabel?.textColor = UIColor.blue
}
}