2013-11-25 4 views
5

Я только что столкнулся с проблемой приложения, которое я тестировал с ошибкой. Я стучал голову к стене, чтобы понять, почему я получил эту ошибку:Вложенные push анимации iOS7 ошибка?

2013-11-25 09:02:55.687[186:60b] nested push animation can result in corrupted navigation bar 
2013-11-25 09:02:56.055[186:60b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
2013-11-25 09:02:57.666[186:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview' 

Через некоторое время я создал новый проект, чтобы попытаться воспроизвести ошибку:

Это happends, когда я надавите на два элементы панели с разными сегментами, а затем отпустите в одно и то же время. Я использую доски объявлений с segues и не имею собственного собственного письменного кода вообще. Является ли это ошибкой iOS7, или я что-то упускаю?

Я не был в состоянии воспроизвести на тренажере, так как у меня нет двух курсоров ... Я использую iPad2 с iOS7 7.0.3

Изображение раскадровку:

enter image description here

EDIT:

Поскольку я был разбит и полностью downvoted без никто даже не пытается воспроизвести и подтвердить эту ошибку, я сообщил об этом без подтверждения.

EDIT2:

Apple, попросил трассировку стека. Но поскольку я дал им точные шаги, чтобы воспроизвести, я не беспокоился. Это не моя работа. Поэтому не стесняйтесь сообщать об этом.

+0

, как он будет генерировать ошибки, если вы попытаетесь нажать любую кнопку – codercat

+0

Я нажимаю обе кнопки панели, удерживая их. и выпустить в одно и то же время. – ullstrm

+0

Это не вопрос программирования и действительно должен быть на доске Apple или в радаре, если вы считаете, что это ошибка. – Fogmeister

ответ

0

Возможно, это связано с тем, что вы одновременно вызываете два сегмента, а когда вы отпускаете кнопки, приложение пытается вызвать один сеанс до завершения другого сеанса.

Так что я вижу, что предупреждение, которое представляет Xcode, связано с тем, что один из ваших контроллеров просмотров запускается с помощью segue, а другой segue для другого контроллера представления запускается, не дожидаясь окончания загрузки первого контроллера представления ,

Вы можете попытаться установить bool или какой-то контроллер, который проверяет, когда загружен первый контроллер представления, а затем запускает ваш другой сеанс, когда вы знаете, что контроллер первого представления правильно загружен.

+0

Да, я выполняю segues вручную теперь с помощью своего собственного булевского флага, чтобы проверить, безопасно или нет. Apple переходит в код с ошибкой. Почему они поощряют нас использовать сюжетные панели, когда они багги? – ullstrm

+1

Большинство проблем и ошибок, с которыми я столкнулся при программировании с помощью инструмента разработчика Apples, - это 99,9% времени моей собственной ошибки, поэтому я не могу комментировать ошибки Xcode. – Oskariagon

+0

И именно поэтому Я разместил это здесь, чтобы узнать, может ли кто-то другой воспроизвести до того, как отправит отчет об ошибке на яблоко. – ullstrm

0

я получаю ту же проблему в моем приложении, выполнив следующие действия: 1 вход (переход осуществляются с анимацией) -быстро сделать выбор на новом экране (запускает другой SEGUE)

если вы пытаетесь выполните переход до того, как предыдущая анимация перехода завершилась, она может испортить ее. Поэтому я добавил задержку перед выполнением segue, и, похоже, это исправить. Однако, я не думаю, что это окончательное решение, потому что продолжительность анимации segue может различаться в зависимости от того, насколько быстро устройство.

Я думаю, что лучшим решением было бы запустить segue AFTER viewDidAppear.

0

Я только что реализовал что-то подобное, и теперь он работает.

Итак, у меня есть контроллеры вида A, B & C. Обычно пользователи могут перемещаться от A до B и от B до C, но теперь я создал способ, с помощью которого пользователи могут перемещаться с A на C (через B) автоматически.

Я сделал, чтобы создать публичный метод в B, чтобы нажать C.Этот метод выглядит следующим образом:

- (void)pushC { 
    if ([self isViewLoaded] && self.navigationController.visibleViewController == self && ![self isBeingPresented] && self.didViewAppear) { 
     [self performSegueWithIdentifier:@"CSegue" sender:self]; 
    } 
    else { 
     [self performSelector:@selector(pushC) withObject:nil afterDelay:0.4f]; 
    } 
} 

Все уже дано вам, кроме того didViewAppear собственности. Я установил true на - viewDidAppear.

Затем мне нужно позвонить только - pushC по методу - prepareForSegue в виде контроллера A. Как мы видели, он будет ждать подходящего времени, чтобы на самом деле вызвать следующий сеанс.

Это работает хорошо, но показывает все навигационные переходы, которые мне не нужны. Я бы предпочел, чтобы иметь возможность вставлять дерево в контроллер навигации, поэтому у меня будет только одна переходная навигация. Ну, я думаю, мне придется вернуться к этой вещи позже.

Это, как говорится, я не думаю, что это ошибка, но на самом деле изменение в поведении в iOS7, потому что анимация получила больше времени.

Смежные вопросы