Исключение UIViewControllerHierarchyInconsistency с MonoTouch

#exception #xamarin.ios #uitabbarcontroller #ios5

#исключение #xamarin.ios #uitabbarcontroller #ios5

Вопрос:

Я обновился до iOS 5 с MonoTouch 2.8 и другими соответствующими обновлениями. У меня есть UIViewController, в котором есть UITabBarController с двумя разными XIBS, настроенными для представления. Также есть выход на 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:

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

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

В презентации WWDC 2011 найдите сеанс 102 — «Реализация сдерживания UIViewController».

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

 window.AddSubview (myViewController.View);
  

Для:

 window.RootViewController = myViewController
  

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

 currentContainer.AddChildViewController (myOtherViewController);
  

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

 myTabBar.ViewControllers [1].AddChildViewController (myFancyController)
  

Комментарии:

1. Я думаю, что часть моей проблемы может заключаться в том, что я пытаюсь использовать UITabBarController вне главного окна, которое, как я думаю, не поддерживается. Я хочу, чтобы в приложении была внутренняя страница с вкладками, в то время как сами главные страницы этого не делают. Именно по этой причине я устанавливал это. Просмотр = это. Панель вкладок. Просмотр, чтобы я мог получить панель вкладок на внутренней странице. Некоторые недавние чтения заставляют меня думать, что панель вкладок не может использоваться, как я пытаюсь сделать. Есть идеи, правильно ли это? Спасибо за ваше руководство.

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

3. Я закончил удаление внутреннего UITabBarController, поскольку он, похоже, противоречит предполагаемому использованию. Я использовал панель инструментов на контроллере навигации, чтобы представить параметры и разрешить переключение.

4. @miguel.de.icaza — когда вы говорите, что поддерживаемый шаблон в iOS 4, поддерживается ли он задокументирован Apple, или вы имеете в виду, что это хак, который, похоже, работает по большей части?