Исключение UIViewControllerHierarchyInconsistency с MonoTouch - PullRequest
2 голосов
/ 21 октября 2011

Я обновился до iOS 5 с MonoTouch 2.8 и другими соответствующими обновлениями. У меня есть UIViewController, в котором есть UITabBarController с двумя разными XIB, настроенными для представления. Также есть выход на UITabBarController. То, что я делал в ViewDidLoad, это

this.View = this.TabBar.View;

Теперь при обновлении до iOS 5 я получаю исключение UIViewControllerHierarchyInconsistency с представлениями в панели вкладок. Я могу сделать

this.View.AddSubview(this.TabBar.View); 

или

this.View.Add(this.TabBar.View);

и исключение прекращается. Проблема, однако, в том, что моя панель вкладок расположена в нижней части экрана, где видна только часть изображения, и вы не можете видеть связанный текст. В процессе поиска я нашел несколько примеров Objective-C, которые выглядят так, как будто они используют маршрут subview, что не помогает. Есть идеи?

1 Ответ

3 голосов
/ 21 октября 2011

Поддерживаемый шаблон в iOS4 был плохой идеей: вы подключили контроллеры представления, захватив внутренний (свойство View контроллера представления) и добавили его в иерархию представления другого контроллера представления. Это было не только некрасиво, но и подняло всевозможные вопросы об иерархии представлений.

Хотя Apple по-прежнему поддерживает базовый шаблон, все продвинутые пользователи больше не поддерживаются, и вам необходимо использовать новую настройку сдерживания viewcontroller. Эти недопустимые виды использования теперь рассматриваются как исключения.

В презентации WWDC 2011 ищите Сессию 102 - «Реализация ограничения UIViewController».

Основные изменения для вашего основного контроллера вида, который займет весь экран, вы меняете старый:

window.AddSubview (myViewController.View);

Кому:

window.RootViewController = myViewController

Для других вы используете новый API:

currentContainer.AddChildViewController (myOtherViewController);

В вашем случае вы добавляете новый ViewController на вашу вкладку, так что вы бы сделали что-то вроде этого для добавления вашего контроллера представления на первую вкладку:

myTabBar.ViewControllers [1].AddChildViewController (myFancyController)
...