#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, или вы имеете в виду, что это хак, который, похоже, работает по большей части?