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>.'
Это старый проект, который я не трогал в течение нескольких месяцев, задаюсь вопросом, что может вызвать такую ошибку?
Ответы
Ответ 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)