Цель C, приложение вылетает при смене контроллера корневого представления. Сиротами без делегатов (ошибка!)
Я реализовал выпадающее меню в своем приложении для iOS, которое вызывает функции для перехода между различными раскадровками. Каждый элемент в этом меню вызывает следующую функцию в классе AppDelegate с другим именем раскадровки:
(void)changeController:(NSString*)storyboardName
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:[NSBundle mainBundle]];
//initialize the new view
currentView = [storyboard instantiateInitialViewController];
currentView.view.alpha = 0.0;
currentView.view.frame = currentView.view.bounds;
currentView.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
//the app crashes on this line with a Thread 1: signal SIGARBT message
self.window.rootViewController = currentView;
[self.window makeKeyAndVisible];
//animate with a fade transition
[UIView animateWithDuration:transitionDuration
delay:0.0
options:UIViewAnimationOptionCurveLinear
animations:^{currentView.view.alpha = 1.0;}
completion:^(BOOL finished){}];
}
Проблема заключается в том, что вызываемая функция не всегда корректно завершает работу приложения. Это работает с одних экранов, а не с других. И что еще хуже, он иногда работает на экранах, на которых он обычно падает.
Есть два сообщения об ошибках, которые выводятся на консоль, и они есть (я добавил разрывы строк для удобства чтения):
Objective: {
objective 0x15e4b3c0: <750:-1.64135e-05> + <750:8.34465e-08>
*<orphaned without delegate (bug!):0x1703c790>{id: 188} + <750:4.17233e-08>
*<orphaned without delegate (bug!):0x1703c980>{id: 192} + <750:-2.68221e-08>
*UIView:0x170c6e40.Height{id: 1091}
}
а также
uncaught exception: <NSISEngine: 0x15e0b380>{ Rows:
UIWindow:0x15db3160.Height{id: 140} == 960 + 1*0x15dd03e0.marker{id: 144}
UIWindow:0x15db3160.Width{id: 137} == 640 + 1*0x15dd03b0.marker{id: 141}
UIWindow:0x15db3160.minX{id: 136} == 0 + 2*0x15dd0200.marker{id: 135} + -0.5*0x15dd03b0.marker{id: 141}
UIWindow:0x15db3160.minY{id: 139} == 0 + 2*0x15dd0350.marker{id: 138} + -0.5*0x15dd03e0.marker{id: 144}
objective{id: 1} == {
objective 0x15e4b3c0: <750:-1.64135e-05> + <750:8.34465e-08>
*<orphaned without delegate (bug!):0x1703c790>{id: 188} + <750:4.17233e-08>
*<orphaned without delegate (bug!):0x1703c980>{id: 192} + <750:-2.68221e-08>
*UIView:0x170c6e40.Height{id: 1091}}
Constraints:
<NSAutoresizingMaskLayoutConstraint:0x15dd03b0 h=--- v=--- H:[UIWindow:0x15db3160(320)]> Marker:0x15dd03b0.marker{id: 141}
<NSAutoresizingMaskLayoutConstraint:0x15dd03e0 h=--- v=--- V:[UIWindow:0x15db3160(480)]> Marker:0x15dd03e0.marker{id: 144}
<_UIWindowAnchoringConstraint:0x15dd0200 h=--- v=--- UIWindow:0x15db3160.midX == + 160> Marker:0x15dd0200.marker{id: 135}
<_UIWindowAnchoringConstraint:0x15dd0350 h=--- v=--- UIWindow:0x15db3160.midY == + 240> Marker:0x15dd0350.marker{id: 138}
Integralization Adjustments:
(none)
Statistics:
4 rows. Variable counts:
1 -> 2
2 -> 2
}: internal error. Cannot find an outgoing row head for incoming head UIView:0x170c6e40.Height{id: 1091}, which should never happen.
Это последняя строка, которая действительно смущает меня, "внутренняя ошибка.... которая никогда не должна происходить".
Мне любопытно, сталкивался ли кто-нибудь еще с этой ошибкой, и как они решили ее.
Это проблема с инициализацией переменной currentView, или, возможно, что-то делать с оконной переменной AppDelegate?
Это действительно проблема с ограничениями раскадровки? И если да, то есть ли ограничение на количество ограничений, которые я могу / должен наложить на один экран?
РЕДАКТИРОВАТЬ:
Я понял, что ошибка действительно была вызвана только при переходе от одной конкретной раскадровки. Ограничение на экране выдавало ошибку. Поэтому я добавил некоторый код в changeController: чтобы программно удалить ограничения из каждого подпредставления, а затем удалить все подпредставления из суперпредставления.
В конечном итоге проблема была решена, когда ограничения в нарушающем UIViewController были очищены и воссозданы.
Спасибо за вашу помощь и предложения.