Как включить кнопку только в выбранной ячейке? - PullRequest
1 голос
/ 25 июня 2019

У меня есть ViewController с TableView внутри. TableView является динамическим, и в нем есть пользовательская ячейка с кнопкой. Количество клеток будет зависеть от API.

Итак, каждая ячейка содержит некоторую информацию, которая передается от API, и каждая ячейка имеет кнопку INFO. По умолчанию я установил

Btninfo.isUserInteractionEnabled = false

И когда пользователь нажимает на ячейку

cell?.Btninfo.isUserInteractionEnabled = true

С помощью этого метода кнопка не будет выбрана до того, как пользователь выберет ячейку, и как только пользователь выберет ячейку, информация будет извлечена из ячейки, а некоторые другие сведения будут получены с использованием indexPath.row ячейки. И эта кнопка Info открывает всплывающее окно, которое показывает подробную информацию о материале внутри ячейки.

Теперь проблема: -

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

Итак, как включить кнопку только для выбранной ячейки и оставить ее отключенной для других ячеек? И отключить кнопку в этой ячейке и включить ее, которую выберет следующий пользователь ячейки?

(я знаю, что могу отключить ячейку на didDeselect, и я не спрашиваю об этом)

Ответы [ 3 ]

3 голосов
/ 25 июня 2019

Обрабатывайте это в самом пользовательском UITableViewCell самом.

  1. Чтобы включить / отключить Btninfo's userInteraction на основе выбора ячейки , переопределить метод setSelected(_:, animated:) в UITableViewCell.

  2. Чтобы отключить Btninfo's userInteraction, когда ячейка используется повторно , отключите ее в методе prepareForReuse().

Вот что я хочу сказать,

class CustomCell: UITableViewCell {
    @IBOutlet weak var Btninfo: UIButton!

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        self.Btninfo.isUserInteractionEnabled = selected
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        self.Btninfo.isUserInteractionEnabled = false
    }
}
Метод

setSelected(_:, animated:) автоматически обработает Btninfo's isUserInteractionEnabled во всех cells, т.е. в выбранном cell, он включит его, а в другом cells он отключит его. Вам не нужно ничего делать в методе tableView(_:didSelectRowAt:).

1 голос
/ 25 июня 2019

Вы взяли один массив класса модели, например arrData: [Data] = [], для отображения данных в табличном представлении.

Пожалуйста, добавьте дополнительную переменную, например isAbleToEnable = false, в класс модели, который вы используете для отображения этих данных.Класс модели будет выглядеть следующим образом:

Class Data {
  ….
  {Your Content}
  ….
  var isAbleToEnable = false
}

Теперь в методе tableview выполните следующие действия

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     self.arrData[indexPath.row].isAbleToEnable = true
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! Cell
    If  self.arrData[indexPath.row].isAbleToEnable {
       cell.Btninfo.isUserInteractionEnabled = true
    //do stuff
   } else {
       cell.Btninfo.isUserInteractionEnabled = false
   }
}
1 голос
/ 25 июня 2019

Я сейчас использую что-то подобное в своем коде.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! Cell
    cell.Btninfo.isUserInteractionEnabled = cell.isSelected
}  

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let cell = tableView.cellForRow(at: indexPath) as? Cell {
        cell.Btninfo.isUserInteractionEnabled = true
    }
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if let cell = tableView.cellForRow(at: indexPath) as? Cell {
        cell.Btninfo.isUserInteractionEnabled = false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...