Пользовательский UITableViewCell button.backgroundColor изменяется автоматически - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть собственный tablevVewCell, связанный с TableViewCell.swift, в ячейке есть кнопка, которая меняет цвет кнопки на зеленый при прикосновении к TouchIpInside, но когда создается новая ячейка (свойство многократного использования dequeue), кнопка новой ячейки также имеет измененные (зеленые)Цвет Я также попытался обработать это, используя if-else, но без помощи. Спасибо за всю помощь (также я имею дело с несколькими разделами здесь).В основном мой вопрос заключается в том, как узнать, что кнопка в классе TableViewCell нажата и назначить значение в MainVC?

MainVC:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
    cell.layer.cornerRadius = 20
    cell.isUserInteractionEnabled = true

    if objArray.count > 0 {
        cell.courseCode.text = objArray[indexPath.section].code
        cell.courseName.text = objArray[indexPath.section].name
        cell.slot.text = objArray[indexPath.section].slot
        cell.year.text = objArray[indexPath.section].year
        cell.button.tag = indexPath.section
    }

    return cell
}

TableViewCell:

class TableViewCell: UITableViewCell {

    @IBOutlet weak var courseName: UILabel!
    @IBOutlet weak var courseCode: UILabel!
    @IBOutlet weak var slot: UILabel!
    @IBOutlet weak var year: UILabel!
    @IBOutlet weak var downloadButton: UIButton!
    @IBOutlet weak var button: UIButton!

    var buttonIsSelected:Bool = false

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
    }

    @IBAction func button(_ sender: Any) {
        print(button.tag)
        buttonIsSelected = true
        button.backgroundColor = .green
    }

}

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Пожалуйста, напишите в методе действия кнопки:

 @IBAction func button (_ sender: Any) {
     let btn = sender as! UIButton
     btn.isSelected = !btn.isSelected
}

Затем в методе CellForRowAtIndexPath проверьте это условие:

    if cell.button.isSelected {
       //Your colour
    } else {
       //Your colour
    }

Это может помочь вам.Спасибо

0 голосов
/ 13 декабря 2018

Когда вы удаляете ячейку из очереди, вы в основном берете старую ячейку, которая уже создана, но не используется.

Таким образом, если вы установили для backgroundColor ячейки зеленый цвет нажатием кнопки, при ее отмене цвет останется зеленым.

Здесь нужно сделать две вещи.

  1. Добавьте поле цвета к объекту модели. Чтобы указать, какой из фона ячейки уже изменил цвет на зеленый.

тогда в методе cellForRow

у вас будет что-то вроде этого

cell.button.backgroundColor = objc[indexPath.section].hasChangedToGreen ? .green : nil

Внутри вашего класса TableViewCell реализуйте это

переопределение func prepareForReuse () {super.prepareForResult () button.backgroundColor = nil}

0 голосов
/ 13 декабря 2018

Вам необходимо отслеживать выбранные и не выделенные кнопки для всех ячеек

  1. Создать массив var buttonState = [Bool]()
  2. Этот массив должен быть равен длине вашего objArray
  3. Изначально он будет иметь все ложные значения
  4. Не указывайте indexPath.section в качестве тега для ячейки, вместо этого используйте indexPath.row

Теперь вы просматриваете пользователя ControlClerследующий код

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
    cell.layer.cornerRadius = 20
    cell.isUserInteractionEnabled = true
    cell.button.addTarget(self, action: #selector(didTapButton(sender:)), for: .touchUpInside)
        if objArray.count>0{
            cell.courseCode.text = objArray[indexPath.section].code
            cell.courseName.text = objArray[indexPath.section].name
            cell.slot.text = objArray[indexPath.section].slot
            cell.year.text = objArray[indexPath.section].year
            cell.button.tag = indexPath.row
        }
    if buttonState[indexpath.row] {
    cell.button.backgroundColor = .green
   }
    else{
      cell.button.backgroundColor = defaultColor `//color of you choice`
    }
        return cell
    }

     @objc func didTapButton(sender:UIButton){
    print(button.tag)
    let state = buttonState[button.tag]
    if !state{
        button.backgroundColor = .green
        buttonState[sender.tag] = true
       }
    }

и измените свой пользовательский класс ячейки на этот

 class TableViewCell: UITableViewCell {
    @IBOutlet weak var courseName: UILabel!
    @IBOutlet weak var courseCode: UILabel!
    @IBOutlet weak var slot: UILabel!
    @IBOutlet weak var year: UILabel!
    @IBOutlet weak var downloadButton: UIButton!
    @IBOutlet weak var button: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
    }


    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    }
0 голосов
/ 13 декабря 2018

Ваш объект из objArray должен иметь какое-либо свойство

var isSelected: Bool

, тогда, когда пользователь нажимает кнопку, вы должны изменить это свойство кнопки (например, с помощью шаблона делегата).

Последнеевам нужно установить цвет фона кнопки в методе источника данных cellForRowAt на основе свойства isSelected элемента

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    let item = objArray[indexPath.row]
    cell.button.backgroundColor = item.isSelected ? .green : .white //default
    ...
}

Примечание: вместо использования indexPath.section use indexPath.row


В качестве альтернативы, если вам не нужно иметь это свойство isSelected в вашей пользовательской модели, вы можете сделать свой objArray словарем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...