Почему высота ячейки не меняется при нажатии кнопки один раз. Работает только когда дважды нажимаю на кнопку - PullRequest
0 голосов
/ 15 апреля 2020

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

Здесь На изображении вы можете увидеть пользовательский интерфейс.

-> Есть таблица Просмотр и кнопка на главном виде.

-> Я взял пользовательский класс tableViewCell. В ячейке я выбрал UIView

. К этому виду добавлены следующие ограничения: центр по горизонтали, высота, ширина, ограничение сверху и снизу

Я добавил выход ограничения высоты для класса TVCell

-> Я взял кнопку и добавил к ней обработчик событий

-> Button Обработчик событий :

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

Теперь проблема в том, что высота ячейки изменяется, когда я нажимаю на кнопка. Но это происходит только тогда, когда я нажимаю одну кнопку дважды. Поэтому я хочу знать, почему это происходит. Здесь я добавляю свой код ниже.

У меня есть одно решение этой проблемы, которое вы можете увидеть после кода кода ViewController & TableViewCell

VIEW CONTROLLER CLASS

import UIKit

class ViewController: UIViewController,UITableViewDataSource{



    @IBOutlet weak var tableView: UITableView!



    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.separatorColor = UIColor.black
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        return cell
    }


    @IBAction func buttonAction(_ sender: Any) {
        let indexPath = IndexPath(row: 0, section: 0)

        let cell = tableView.cellForRow(at: indexPath) as! TableViewCell

        if cell.viewHeightConstraint.constant == 75 {
            cell.viewHeightConstraint.constant = 10
        }
        else{
            cell.viewHeightConstraint.constant = 75
        }

        tableView.reloadRows(at: [indexPath] , with: UITableView.RowAnimation.automatic)
    }

}

TABLEVIEWCELL CLASS

import UIKit

class TableViewCell: UITableViewCell {

    @IBOutlet weak var viewHeightConstraint: NSLayoutConstraint!

    override func awakeFromNib() {
        super.awakeFromNib()

        //Setting View Height To 75
        viewHeightConstraint.constant = 75

    }

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

    }
}

Вы можете получить этот исходный код по этой ссылке ниже

https://github.com/himansudev/tableViewIssue_15_4_20_1.git

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

1) Я изменил обработчик событий кнопки, см. Ниже модифицированный код. Пожалуйста, обратитесь к приведенному выше коду для определения изменений, которые я внес в этот обработчик событий

  @IBAction func buttonAction(_ sender: Any) {
        let indexPath = IndexPath(row: 0, section: 0)
        tableView.reloadRows(at: [indexPath] , with: UITableView.RowAnimation.automatic)
    }

2) Во-вторых, я добавил этот дополнительный фрагмент кода, см. Ниже

 override func viewDidLayoutSubviews() {

        print("viewDidLayoutSubviews")

        let indexPath = IndexPath(row: 0, section: 0)

        let cell = tableView.cellForRow(at: indexPath) as! TableViewCell

        if cell.viewHeightConstraint.constant == 75 {
            cell.viewHeightConstraint.constant = 10
        }
        else{
            cell.viewHeightConstraint.constant = 75
        }

    }

Найти исходный код после изменений ниже

https://github.com/himansudev/tableViewSolution_15_4_20_1.git

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

ТАК Я хочу знать, почему она так себя ведет ??

1 Ответ

0 голосов
/ 21 апреля 2020

Прежде всего вам необходимо добавить UITableViewDelegate к вашему ViewController и переменную, подобную этой:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!
var cellHeight: CGFloat = 75

, и функцию heightForRow, которая будет возвращать нужную высоту:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return cellHeight
}

Затем нажмите на кнопку:

@IBAction func buttonAction(_ sender: Any) {        

    if cellHeight == 75 {

        cellHeight = 10
    }
    else{

        cellHeight = 75
    }

    tableView.reloadData()
}

Также удалите ограничение viewHeightConstraint, поскольку оно вам не нужно.

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