Цель 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 были очищены и воссозданы.

Спасибо за вашу помощь и предложения.

0 ответов

Другие вопросы по тегам