Подтвердить что ты не робот

UIViewControllerHierarchyInconsistency при попытке представить контроллер модального представления

Попытка представить контроллер модального просмотра со следующим кодом

MapViewController *mapView = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil];
    mapView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.navigationController presentModalViewController:mapView animated:YES];
    [mapView release];

Продолжайте получать следующую ошибку.

'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UIView: 0x1ed815a0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x1ed81600>> is associated with <UIViewController: 0x1ed835a0>. Clear this association before associating this view with <MapViewController: 0x1dd947c0>.'

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

4b9b3361

Ответ 1

Это произошло со мной уже дважды в новейшей версии Xcode. В обоих случаях мне нужно было внести изменения в файл XIB UIViewController (в вашем случае это будет MapViewController.xib:

ДО:

enter image description here

  • Переместить main Просмотр из Просмотр контроллера детей:
  • Удалить View Controller из XIB (это необязательно, так как Владелец файла должен быть своего класса уже):

ПОСЛЕ:

enter image description here

Ответ 2

У меня была эта проблема при запуске Apple app audio app MixerHost на симуляторе iOS 6.

Эквивалент вышеупомянутого исправления, а именно: отредактировать поставляемый MixerHostViewController.xib, перетащив объект View на верхний уровень и отбросив теперь пустой ViewController, который использовался для его хранения, работал отлично (хотя не раньше, чем я потратив часы на то, что было основной проблемой, так что я чувствую себя совершенным Apple на данный момент - кажется, что они что-то затянули, но не потрудились проверить, не сломали ли они свои примерные приложения).

Ответ 3

У меня была эта проблема, когда у моего Nib был UIViewController в файле на верхнем уровне. Поэтому загрузка из Nib, созданная с помощью UIViewController, затем я попытался использовать ее из моего класса, который был в позиции MapViewController в вашем коде.

В моем случае решение было просто удалить UIViewController из моего файла Nib.

Ответ 4

Вы должны сделать это вот так.

MapViewController *mapView = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil];
UINavigationController *navCntrlr = [[UINavigationController alloc] initWithRootViewController:mapView];
mapView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
//hide navigation bar if needed
[self.navigationController presentModalViewController:navCntrlr animated:YES];
[mapView release];

Ответ 5

Возможно, в некоторых случаях лучше использовать другой подход и не удалять UIViewController из NIB, потому что, с одной стороны, удалив контроллер представления из иерархии NIB, вы теряете поля Auto Layout.

Почему бы просто не оставить UIViewController в своем nib (.xib) и создать для него выход в класс владельца файла? Затем, вместо того, чтобы создавать экземпляр диспетчера представлений непосредственно в вашем коде, загрузите nib классом UINib и в оптимальное время (с точки зрения использования памяти/ресурса) вызовите метод экземпляра экземпляра nib экземпляраWithOwner(), чтобы разблокировать NIB и подключиться объекты-нибы для выходов класса владельца.

    @IBOutlet var myViewController: myViewController?

    var nib : UINib?
    nib = UINib(nibName: "TheNib", bundle: nil)
    if (nib == nil) {
        println("could not load nib: TheNib.xib")
    }
    nib!.instantiateWithOwner(self, options: nil)