Высота UITableView не изменяется во время выполнения при нажатии кнопки с помощью SnapKit - PullRequest
0 голосов
/ 27 января 2020

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

[LayoutConstraints] Unable to simultaneously satisfy constraints.   Probably at least one of the constraints in the following list is one you don't want.   Try this:       (1) look at each constraint and try to figure out which you don't expect;       (2) find the code that added the unwanted constraint or constraints and fix it.  (
    "<SnapKit.LayoutConstraint:0x6000014e40c0@AddTravellerViewController.swift#49 UITableView:0x7ff246001200.height == 60.0>",
    "<SnapKit.LayoutConstraint:0x6000014e5860@AddTravellerViewController.swift#49 UITableView:0x7ff246001200.height == 120.0>" )

Действие UIButton: я загружаю эту функцию в viewdidload впервые. со второго раза печатается указанное выше сообщение об ошибке.

func addButtonAction(){

    travellersCount! += 1
    tableHeight! += 60

    tableView.snp.makeConstraints { (make) in
        make.left.equalTo(self.view).offset(10)
        make.right.equalTo(self.view).offset(-10)
        make.top.equalTo(self.view).offset(120)
        make.height.equalTo(tableHeight!)
    }

    addButotn.snp.makeConstraints { (make) in
        make.left.right.equalTo(self.view)
        make.height.equalTo(40)
        make.top.equalTo(tableView.snp.bottom).offset(10)
    }

    tableView.reloadData()
}

TableView

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return travellersCount!
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "Textcell", for: indexPath) as! TextfieldTableViewCell
    cell.backgroundColor = .clear
    return cell

}

Ответы [ 2 ]

1 голос
/ 27 января 2020

Вы получаете сообщение об ошибке, потому что вы уже объявили ограничение высоты для вашего UITableView через makeConstraints метода SnapKit, и ваш addButtonAction() предположительно вызывается более одного раза, чтобы продолжать "создавать" конфликтующие ограничения по высоте с большими значениями

Что ж, viewDidLoad обычно вызывается не более одного раза, но лучше этого не предполагать и выполнять внутри него одноразовые настройки. Если вы создаете экземпляр из файла пера, попробуйте сделать это внутри awakeFromNib ...

Теперь, чтобы решить это внутри viewDidLoad: -

1) Если вы хотите, чтобы это быть одноразовым процессом, вы можете создать свойство (типа Constraint, которое является пользовательским типом объекта SnapKit) для хранения ссылки на ограничение высоты, которое вы объявляете внутри tableView.snp.makeConstraints, и выполнять проверку nil:

Delcare свойство выше:

private var tableViewHeightConstraint: Constraint?

и сделать нулевую проверку:

tableView.snp.makeConstraints { (make) in
    make.left.equalTo(self.view).offset(10)
    make.right.equalTo(self.view).offset(-10)
    make.top.equalTo(self.view).offset(120)

    if self.tableViewHeightConstraint == nil {
       self.tableViewHeightConstraint = make.height.equalTo(tableHeight!)
    }
}

2) Или, если вы хотите обновить высоту каждый раз (как вы увеличиваете tableHeight на 60), вы можете использовать updateConstraints:

tableView.snp.updateConstraints { (make) in
    //Update your height constraint here. Note: This will keep increasing the height of your table on every call
    make.height.equalTo(tableHeight!)
}

(после этого может потребоваться позвонить layoutIfNeeded(), чтобы изменения произошли)

Я не тестировал этот код, но он должен сделать это для вас. Если нет, дайте мне знать ...

0 голосов
/ 27 января 2020

set heightForRow UITableView.automaticDimension устанавливает высоту строки автоматов c в соответствии с содержимым.

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