Приложение вылетает при переопределении ограничения высоты представления на ноль - PullRequest
0 голосов
/ 21 сентября 2018

В моем приложении три UIViews с UILabel и UITableView, отображающими пользователей.Когда нет пользователей, я хочу полностью скрыть вид.В настоящее время я пытаюсь установить представления heightAnchor на ноль, но это приводит к этой ошибке:

Невозможно одновременно удовлетворить ограничения.

"NSLayoutConstraint: 0x604000286cc0 LebensfitFirebase.SurePeople: 0x7ff0305d5d30.height == 300 (active)> ",

" NSLayoutConstraint: 0x60c000095b30 LebensfitFirebase.SurePeople: 0x7ff0305d5d30.height == 0 (active)> "

Будет предпринята попытка восстановления путем нарушения ограничения

NSLayoutConstraint: 0x604000286cc0 LebensfitFirebase.SurePeople: 0x7ff0305d5d30.height == 300 (активный)>

Что я должен касаться, чтобы эта работа?Кстати, я установил translatesAutoresizingMaskIntoConstraints в ложь.Сначала я установил три вида следующим образом:

surePeopleTV.anchor(top: descLabel.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
maybePeopleTV.anchor(top: surePeopleTV.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
nopePeopleTV.anchor(top: maybePeopleTV.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)

Это пользовательский метод для установки ограничений в одну строку.Константа высоты не устанавливается в 0 с помощью этого метода.

Затем в моей программе меня волнует ограничение высоты при обновлении пользователей в табличных представлениях:

func teilnehmerLoaded() {
    if surePeopleTV.finishedLoading == true && maybePeopleTV.finishedLoading == true && nopePeopleTV.finishedLoading == true {
        view.setNeedsUpdateConstraints()
        for controller in tableViewControllers {
            if controller.users.count > 0 {
                let height: CGFloat = 300
                controller.heightAnchor.constraint(equalToConstant: height).isActive = true
                controller.confBounds()
            } else {
                controller.heightAnchor.constraint(equalToConstant: 0).isActive = true 
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Благодаря Ш_Хану я смог ее решить:

var heightCons = [NSLayoutConstraint]()

Внутри ViewDidLoad:

for controller in tableViewControllers {
        let heightCon = controller.heightAnchor.constraint(equalToConstant: 0)
        heightCon.isActive = true
        heightCons.append(heightCon)
}

И теперь функция выглядит так:

func teilnehmerLoaded() {
    if surePeopleTV.finishedLoading == true && maybePeopleTV.finishedLoading == true && nopePeopleTV.finishedLoading == true {
        for (index, controller) in tableViewControllers.enumerated() {
            var height = CGFloat(controller.users.count) * 60.0
            if controller.users.count > 0 {
                height += (25 + 20)
                heightCons[index].constant = height
                controller.confBounds()
            } else {
                heightCons[index].constant = height
            }
            view.layoutIfNeeded()
        }
    }
}
0 голосов
/ 21 сентября 2018

Это создает ограничения при каждом вызове функции и вызывает конфликты вместо того, что вы хотите

var heightCon:NSLayoutConstraint!

Внутри viewDidLoad

heightCon =  controller.heightAnchor.constraint(equalToConstant: <#defaultHeight#>)
heightCon.isActive = true

Затем играете с постоянным значением

func teilnehmerLoaded() {
    if surePeopleTV.finishedLoading == true && maybePeopleTV.finishedLoading == true && nopePeopleTV.finishedLoading == true {
        view.setNeedsUpdateConstraints()
        for controller in tableViewControllers {
            if controller.users.count > 0 {
                heightCon.constant = 300
                view.layoutIfNeeded()
                controller.confBounds()
            } else {
                heightCon.constant = 0
                view.layoutIfNeeded()
            }
        }
    }
}

Кстати: если у вас есть регистр массива, используйте

var heightCons = [NSLayoutConstraint]()

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


Другой лучший способ - это

func teilnehmerLoaded() {
    if surePeopleTV.finishedLoading == true && maybePeopleTV.finishedLoading == true && nopePeopleTV.finishedLoading == true {
         for controller in tableViewControllers {
            if let heightCon = controller.constraints.first { $0.identifier == "height" }  {

                  heightCon.constant = controller.users.count > 0 ? 300 : 0
            }
            else {

                  let heightCon = controller.heightAnchor.constraint(equalToConstant:  controller.users.count > 0 ? 300 : 0)
                  heightCon.isActive = true
                  heightCon.identifier = "height"
             }

             if controller.users.count > 0 {
                controller.confBounds()
             }

        }

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