У меня была такая же проблема при создании массива NSLayoutConstraints, после чего все сразу включались из массива.
Когда вы переходите в сторону от просмотра, возвращайтесь к нему, иногда представление может быть назначено на другое распределение памяти и вызывает ошибку «Плохой доступ».
Вот что происходит. Новые ограничения добавляются в массив каждый раз при загрузке представления (при условии, что вы добавляете их и активируете их из функции .viewDidLoad()
или из аналогичной функции, которая загружается каждый раз, когда вид становится видимым снова).
Массив не пуст, когда вы перемещаетесь от него, поэтому старые ограничения также остаются в массиве. Когда вы переходите к просмотру и пытаетесь активировать ограничения, система пытается снова активировать старые ограничения (которые ссылаются на память, которая не содержит ни одного из видов, к которым ваши ограничения ссылаются больше).
Чтобы исправить это, позвоните .RemoveAll()
в свой массив, прежде чем добавлять к нему новые ограничения. Это позволит удалить все старые ограничения и система не будет пытаться их активировать.
Вот пример.
var initialConstraints = [NSLayoutConstraint]()
override func viewDidLoad() {
super.viewDidLoad()
// Empty the array once the view loads
initialConstraints.removeAll()
// Add your constraints like normal
initialConstraints.append(...)
// Activate your constraints once you've added them to the array (like normal)
NSLayoutConstraint.activate(initialConstraints)
}
Надеюсь, это поможет!
Это в основном выглядит прекрасно (см. Ниже приведенную ниже ссылку). Меня устраивает. Где вы называете это 'addConstraints'? Очевидно, что это должно быть в подклассе 'UIView', но где именно вы это делаете? В нижней строке нам понадобится [MCVE] (http://stackoverflow.com/help/mcve). Я не могу воспроизвести проблему на основе того, что вы здесь указали. – Rob
Несвязанные, как правило, вы бы сказали 'options: []'. 'NSLayoutFormatOptions' является' OptionSet', а пустой набор - '[]'. Фактически, с помощью метода 'constraints' этот параметр' options' является необязательным, по умолчанию используется '[]', поэтому вы можете даже опустить 'options: []' вообще. – Rob