iPhone UINavigation Issue - вложенная push-анимация может привести к повреждению панели навигации - PullRequest
69 голосов
/ 03 апреля 2011

Я получаю следующие ошибки:

2011-04-02 14:55:23.350 AppName[42430:207] nested push animation can result in corrupted navigation bar
2011-04-02 14:55:23.352 AppName[42430:207] nested push animation can result in corrupted navigation bar
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2011-04-02 14:55:23.729 AppName[42430:207] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

Вот что я делаю. При нажатии определенной кнопки из контроллера представления я вызываю следующее:

EventsViewController *viewController = [[EventsViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBar.tintColor = [UIColor blackColor];
[self presentModalViewController:navController animated:YES];
[viewController release];
[navController release];

Затем, если в EventsController нажать определенную кнопку, я вызываю:

SingleEventViewController *viewController = [[SingleEventViewController alloc] initWithEvent:[currentEvents objectAtIndex:indexPath.row]];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];

Затем, если в SingleEventViewController нажать определенную кнопку, я вызываю:

EventMapView* viewController = [[EventMapView alloc] initWithCoordinates];
[[self navigationController] pushViewController:viewController animated:YES];
[viewController release];

Так, да, очевидно, что есть вложенные анимации push, но разве это не правильный путь? Я проверил код Apple DrillDownSave, и похоже, именно так они и делают. Имеет ли значение, что я использую методы init вместо методов viewDidLoad?

Ответы [ 20 ]

1 голос
/ 31 июля 2014

Недавно я столкнулся с той же проблемой.Причина была в следующем: -Я пытался дважды открыть контроллер просмотра по ошибке.Вы можете проверить этот сбой, установив точки останова на контроллерах push и pop View

0 голосов
/ 09 октября 2014

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

Вызов super - это то, что документы четко указывают, что вы должны делать при переопределении viewDidLoad, и я узнал этотрудный путь.

Может быть, это может помочь кому-то еще!

0 голосов
/ 20 августа 2014

В моем случае я одновременно настраивал толчок передачи от раскадровки и программно. Надеюсь, это кому-нибудь поможет

0 голосов
/ 05 июля 2014

Это решает проблему: https://github.com/nexuspod/SafeTransition

Если вы нажимаете (или извлекаете) контроллер представления с анимацией (анимированный: ДА), он не завершается сразу же, и происходят плохие вещи, если вы делаете еще одно нажатие или щелкаете до завершения анимации.

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

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    UIViewController *vc = [[UIViewController alloc] init];
    [self.navigationController pushViewController:vc animated:YES];
}

Вы получите эту ошибку:

2014-07-03 11: 54: 25.051 Демонстрационная [2840: 60b] вложенная анимация push привести к повреждению панели навигации 2014-07-03 11: 54: 25.406 Демонстрация [2840: 60b] Завершение перехода при неожиданном переходе государство. Дерево подпредставлений панели навигации может быть повреждено.

Просто добавьте файлы кода в ваш проект и сделайте ваш навигационный контроллер подклассом APBaseNavigationController, и вам будет хорошо.

0 голосов
/ 19 мая 2014

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

В моем случае проблема заключалась в том, что, когда я перемещался в другой вид, используя push, Я также использовал

 [self.navigationController popViewControllerAnimated:YES];

в ViewWillDisappear текущего просмотра в то же время. Просто удалите его, и он отлично работает.

Я использовал POP из-за требований и потока. Иерархия была 1 -> 2 -> 3

Я был в представлении 2 и хотел перейти к представлению 3. В этом случае я столкнулся с этой ошибкой.

0 голосов
/ 03 апреля 2013

Мое решение было

[self executeSelector: @selector (moveTo) withObject: nil afterDelay: 0,5];

0 голосов
/ 03 апреля 2011

1) Возможно, вы можете попробовать передать необходимые переменные в качестве свойств, прежде чем нажимать UIViewController, вместо использования методов init с параметрами. Скорее всего, вам все равно понадобятся эти параметры вне вашего метода init.

Кроме того, в вашем методе initWithCoordinates: вам не хватает параметров. Возможно, ваши собственные методы инициализации являются частью проблемы.

2) Только потому, что вы упомянули viewDidLoad - этот метод предназначен для инициализации после загрузки представления. Если вы создаете UIViewController в коде, как вам кажется, вы должны использовать loadView для настройки ваших подпредставлений.

0 голосов
/ 05 декабря 2014

Я знаю, что на это ответили, но это может помочь другим.

У меня была такая же проблема, но она была вызвана тем, что я использовал неверное событие для информационной кнопки. Я использовал «UIControlEventAllTouchEvents», и это вызвало два нажатия одного и того же представления в контроллер навигации. Правильным событием было «UIControlEventTouchUpInside». Я новичок в iOS.

0 голосов
/ 29 апреля 2016

Просто для завершения списка, вот еще одна причина, которая может привести к тому, что «вложенная анимация толчка может привести к повреждению панели навигации»:

Я установил несколько NavigationController в TabBarController и установил selectedIndex в раскадровке идентифицировать свойства. После перемещения активной вкладки в код ошибка исчезла.

0 голосов
/ 11 июля 2013

Это происходило для меня из-за моего UIControlEvents

    [button addTarget:self action:@selector(callSecondView) forControlEvents:UIControlEventAllTouchEvents];

Мне пришлось изменить UIControlEventAllTouchEvents на UIControlEventTouchUpInside, или же вы хотите, чтобы ваша кнопка работала, если у вас возникла проблема из-за вызова UIButton.

...