iOS: addConstraints: сбой приложения

Проблема

Кажется, я не могу внедрить Auto Layout в свой существующий проект.

Подробности

Раньше у меня была такая же проблема, как и в этом вопросе presentViewController: сбой на iOS ‹6 (AutoLayout), но ни один из предоставленных ответов не был для меня решением: я использую все представления раскадровки без xib. Моя настройка «Использовать автоматический макет» уже отключена, и я использую только iOS 6.

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

Код

Я свяжу свой код, но он довольно прост.

-(void)addAllConstraints
{
    NSDictionary * views = NSDictionaryOfVariableBindings(_memoryImage, _peopleView, _contentHolder, _commentsTableView);
    NSArray * constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[_memoryImage]-50-[_peopleView]-0-[_contentHolder]-0-[_commentsTableView]" options:0 metrics:nil views:views];
    NSLog(@"Views %@, Constraints %@", views, constraints);
    [_peopleView addConstraints:constraints];
    [_memoryImage addConstraints:constraints];
    [_contentHolder addConstraints:constraints];
   [_commentsTableView addConstraints:constraints];
}

Приложение аварийно завершает работу при вызове _peopleView addConstraints. И представления, и NSLayoutConstraints успешно созданы.

Любые идеи? Спасибо, счастливых праздников.

РЕДАКТИРОВАТЬ:

Добавление журналов сбоев, чтобы показать, что ничего полезного не отображается:

2012-12-25 10:40:13.936 -----[4955:907] Views {
"_commentsTableView" = "<UITableView: 0x1eb6be00; frame = (0 372; 320 100); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x1e51ce00>; layer = <CALayer: 0x1e51cee0>; contentOffset: {0, 0}>";
"_contentHolder" = "<UIView: 0x1e5c6590; frame = (0 270; 320 112); layer = <CALayer: 0x1e5c27f0>>";
"_memoryImage" = "<UIButton: 0x1e5c4aa0; frame = (0 0; 320 280); opaque = NO; layer = <CALayer: 0x1e5c4b60>>";
"_peopleView" = "<UIView: 0x1f0ceea0; frame = (0 230; 320 50); layer = <CALayer: 0x1f0cf790>>";

Constraints (
"NSLayoutConstraint:0x1e51a880 V:[UIButton:0x1e5c4aa0]-(50)-[UIView:0x1f0ceea0]",
"NSLayoutConstraint:0x1e5ba4e0 V:[UIView:0x1f0ceea0]-(0)-[UIView:0x1e5c6590]",
"NSLayoutConstraint:0x1e51b860 V:[UIView:0x1e5c6590]-(0)-[UITableView:0x1eb6be00]"
)


}  
   (lldb) 

person Rob Caraway    schedule 25.12.2012    source источник
comment
Это, безусловно, дает вам некоторую информацию в журнале сбоев. Во-первых, ваши константы интервалов должны быть в скобках.   -  person jrturton    schedule 25.12.2012
comment
developer.apple.com/library/mac/#documentation/UserExperience/ Неправда. И нет, в аварийном журнале вообще ничего нет.   -  person Rob Caraway    schedule 25.12.2012
comment
@RobCaraway Должен быть хоть какой сбой произошел. Это SIGABRT? EXC_BAD_ACCESS? Или что?   -  person    schedule 25.12.2012
comment
Я ошибся насчет скобок, извините. Я думаю, что у rdelmar есть ваш ответ, но для получения дополнительной информации при отладке ограничений вы можете найти полезную точку останова для всех исключений.   -  person jrturton    schedule 26.12.2012
comment
Рделмар действительно был прав. Тем не менее, для пояснения для будущих наблюдателей, это действительно было SIGABRT, и когда я искал решения, были включены точки останова по исключению.   -  person Rob Caraway    schedule 26.12.2012


Ответы (1)


Предполагается, что ограничения должны быть добавлены к представлению, которое является супервизором подпредставлений. Итак, если эти объекты находятся в вашем основном представлении, тогда у вас должны быть (и ни одна из других строк addConstraints:):

[self.view addConstraints:constraints];

Кроме того, ваш словарь, views, должен быть завершен nil (я не знаю, необходимо ли это или нет. Я заметил в примере Apple, что они этого не делали, но определение функции показывает это с nil) .

person rdelmar    schedule 25.12.2012
comment
Для этого макроса словаря привязок не нужно использовать nil terminate. - person jrturton; 26.12.2012