Смена цвета выбранной строки таблицы

swift

#1

У меня есть таблица в которой по нажатию на строку она (строка) должна менять цвет (“выбираться”).
Технически это получилось сделать при помощи
var selectedCell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
selectedCell.contentView.backgroundColor = UIColor.redColor()
Но когда я нажимаю на другую строку, то предыдущая возвращается в первоначально состояние. Как можно реализовать множественный выбор?


#2

А может вам вставить в ячейку пустую вьюху и уже ей закрашивать бекграунд при нажатии на ячейку таблицы?


#3

Точно, как-то об этом не подумал, спасибо за ответ)


#4

Я создал кастомную ячейку, добавил в неё вьюху и создал в классе ячейки аутлет. В didSelectRowAtIndexPath я вызываю этот вью и присваиваю ему цвет, но ничего не меняется по нажатию
let cell: AlcoholCell = self.alcoholTable.dequeueReusableCellWithIdentifier("cell") as! AlcoholCell
cell.chooseView.backgroundColor = UIColor.greenColor()


#5

А добавили ваш созданный класс вашей кастомной ячейки в MainStoryboard?


#6

Да, везде добавил. Лейблы же работают


#7

Не знаю должно работать, что то не то делаете. Дайте больше кода.


#8

Класс кастомной строки

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 везде добавлены классы


#9

Вы создаете ячейку совсем не в том методе. Так должно быть

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
}

#10

Так они все получаются покрашенными в зеленый цвет, а надо только те, на которые я нажимаю. Поэтому и решил, что надо в didSelectRowAtIndexPath


#11

Ну так теперь используйте этот метод

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    cell.chooseView.backgroundColor = UIColor.blueColor()

}

#12

Просто небольшая предыстория к приложению:
Может тут есть студенты или бывшие студенты ФТК Санкт-Петербургского Политеха. Есть там препод по программированию, Хлопин С. В., и гуляет по факультету легенда (которую он не отрицает), что единственная программа, которую он написал за свою жизнь - это алкогольный калькулятор для расчета спиртного на компанию. И мы поспорили с ним на отлично за экзамен, что я смогу не хуже сделать


#13

Ну дерзайте) Все в ваших руках)


#14

Не получается так, потому что UITableView has no mamber ‘chooseView’


#15
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    
    let cell = tableView.cellForRowAtIndexPath(indexPath) as! AlcoholCell
    cell.chooseView.backgroundColor = UIColor.blueColor()

}

#16

Да, сейчас меняет цвет, спасибо вам большое. А вы не знаете, как можно сделать, чтобы можно было так менять цвет у нескольких ячеек? Просто сейчас, выбирая другую, я предыдущей цвет скидывается на белый. Я пробовал через массив записывать индексы строк, ктоторые используются и менять цвет в зависимости от того, чему равен индекс в массиве, но всё равно не получается


#17

Можете добавить вот такой код

override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
        let cell = tableView.cellForRowAtIndexPath(indexPath) as! TableViewCell
        cell.viewView.backgroundColor = UIColor.blackColor()
    }

#18

Можно подойти немного по другому.
Создать дополнительный массив bool элементов который будет отслеживать состояние ячейки.

Когда создаёте ячейку даёте окрас нужный проверяя свой массив.

Естественно, постоянно придётся делать reload table, чтобы таблица заново прорисовывалась, после нажатий различных.

Массив будет задаваться в didSelect, да впрочем где угодно.


#19

Рекомендую повнимательнее изучить иерархию вьюх в 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


#20

Можно костыльным способом. создаете массив булевых значений например
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

        }

}