Как установить стиль UIButton для определенного UITableViewCell без программного изменения других ячеек? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть FlagButton, который расширяется UIButton. Я добавил это к UITableCell. При нажатии на кнопку я хочу изменить цвет фона, но только для кнопки в этой ячейке. В настоящее время это изменение цвета и для других ячеек.

class FlagButton: UIButton {
    // ..

    func initStyle() {
        self.backgroundColor = UIColor.red
        self.setTitle("foo", for: .normal)
        self.setTitleColor(UIColor.black, for: .normal)
        self.addTarget(self, action: #selector(touchDown), for: .touchDown)
    }

    @objc func touchDown() {
        self.backgroundColor = UIColor.green
    }
}
class PostViewCell: UITableViewCell {
    var flagBtn: FlagButton?

    override func awakeFromNib() {
        super.awakeFromNib()
        flagBtn = FlagButton(frame: CGRect(x: 0, y: 0, width: 30, height: 20))
        guard let flagBtn = flagBtn else { return }
        flagBtn.initStyle()
        contentView.addSubview(flagBtn)
    }
}
// ..
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = latestTableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostViewCell
    // ...
}

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Причина, по которой кнопка изменяется для других ячеек, заключается в том, что UITableView повторно использует ячейки.Таким образом, ячейка, в которой фон кнопки был изменен, снова используется позже в функции latestTableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostViewCell

Вам необходимо отслеживать, какая ячейка была изменена.А в вашей функции dequeueReusableCell проверьте, является ли она той же самой ячейкой, затем измените фон для UIButton, иначе сделайте его нормальным.

0 голосов
/ 02 апреля 2019
class TableViewController: UITableViewController {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell

    cell.oneButton.addTarget(self, action: #selector(TableViewController.oneTapped(_:)), for: .touchUpInside)
    cell.twoButton.addTarget(self, action: #selector(TableViewController.twoTapped(_:)), for: .touchUpInside)

    return cell
    }

    func oneTapped(_ sender: Any?) {
        print("Tapped")
    }

    func twoTapped(_ sender: Any?) {
        print("Tapped")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...