Ограничение должно содержать первый элемент макета NSLayoutConstraint - программирование
Подтвердить что ты не робот

Ограничение должно содержать первый элемент макета NSLayoutConstraint

У меня были мои LayoutConstraints, которые отлично работали, и вдруг я начал получать это, добавляя Constraints к моему представлению.

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Constraint must contain a first layout item'
*** First throw call stack:
(0x7cd012 0x2017e7e 0x7ccdeb 0xde6bf1 0x9c487 0x994a3 0x414fb 0x20224 0x5c6c0 0xc30e83 0x78c376 0x78be06 0x773a82 0x772f44 0x772e1b 0x28eb7e3 0x28eb668 0x149465c 0x2cfd 0x2c25)
libc++abi.dylib: terminate called throwing an exception

И нет никакой непосредственной документации в Интернете или в Документах Apple о том, что означает сообщение об ошибке.

Просто интересно, кто-нибудь столкнулся с этой ошибкой и знаете, что я могу сделать, чтобы устранить ее?

4b9b3361

Ответ 1

А, нашел проблему. Для тех, кто имеет эту проблему, это потому, что представление еще не создано в nib/UIView, поэтому никакие ограничения не могут применяться.

Я переместил код Constraint из метода initWithNib в viewDidLoad, и ошибка, естественно, остановилась.

Ответ 2

Еще одна причина для этой ошибки/сбоя может быть, представления, переданные в метод [NSLayoutContraint constraintWithItem...], равны нулю.

Ответ 3

Если вы подходите к своим представлениям со свойствами, убедитесь, что они сильны! Это может объяснить, что они ноль.

Ответ 4

Это также может произойти, если по какой-либо причине вы отключите автозапуск, но вы все равно добавляете ограничения на любой под просмотр через код (например, для обработки изменений ориентации)

Это случилось со мной, когда я использовал разные NIB для iPhone и iPad и отключил Autolayout только для iPhone NIB при использовании общего файла .m.

Решение - проверить тип устройства и пропустить добавление макета там, где он не нужен.