UINavigationController NIB требует, чтобы владелец файла имел представление? - PullRequest
6 голосов
/ 02 июня 2009

У меня возникла проблема с настройкой выходного отверстия по умолчанию для пера View Controller в Интерфейсном Разработчике. Вот мои настройки:

У меня есть приложение на основе TabBar, где я загружаю Navigation Controller как модальное представление ...

MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc]initWithNibName:@"MenuController" bundle:nil];
[tabBarController presentModalViewController:menu animated:anim];

Сам MenuController имеет следующую структуру:

MenuController.xib
  File's Owner (MyNavCtrlrSubClass : UIViewController)
  Navigation Controller (UINavigationController)
    Navigation Bar (UINavigationBar)
    Root View Controller (Nib Name is set to load AnotherViewController.nib)
      Navigation Item -> (UINavigationItem)

Это все работает нормально, за исключением того, что при загрузке MyNavCtrlrSubClass я получаю следующую ошибку:

Loaded the "MenuController" nib but the view outlet was not set

Понятно, почему это происходит - у владельца файла нет выходного соединения для его просмотра. Вопрос в том, что я должен установить в качестве его вида, и нужно ли что-то устанавливать в первую очередь? Панель навигации является единственным кандидатом в MenuController.xib, но при этом просто изменит размер самого UINavigationBar. в полноэкранный режим, так сказать.

Я явно что-то упускаю в IB, но что? MyNavCtrlrSubClass.m не имеет самого кода, кроме IBOutlet для UINavigationController. Я делаю ошибку, пытаясь настроить это полностью в IB? Идея состоит в том, чтобы держать модальный Navigation Controller в одном наконечнике, а все представления, которые он загружает, в отдельных наконечниках, но поскольку MenuController - это просто контейнер для навигации и не содержит никаких представлений, я, очевидно, неправильно его проектирую. :)

Если вам интересно, почему я не создаю это каким-то другим способом, это потому, что я пытаюсь подчиниться моему (возможно, ошибочному) восприятию того, как IB просит вас построить идеальную иерархию.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 03 июня 2009

Я думаю, что вы, возможно, не понимаете, как владелец файла предназначен для использования в файле NIB. Я написал ответ с описанием владельца файла под другим вопросом .

Когда вы вызываете эту строку:

[[MyNavCtrlrSubClass alloc] initWithNibName:@"MenuController" bundle:nil]

Вы создаете экземпляр MyNavCtrlrSubClass и говорите ему загрузить @ "MenuController". Затем в файле MenuController.xib есть второй не связанный UINavigationController с вещами внутри него. Когда MenuController.nib загружается во время выполнения, будет создан второй контроллер навигации.

Вторая проблема заключается в том, что указание UINavigationController загружать файл NIB не очень разумно, поскольку контроллеры навигации создают и управляют своими собственными представлениями. Вы действительно хотите создать корневой контроллер представления и сказать этому контроллеру загрузки для загрузки файла NIB.

Попробуйте это:

MyRootViewController *rootController = [[[MyRootViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil] autorelease];
MyNavCtrlrSubClass *menu = [[MyNavCtrlrSubClass alloc] initWithRootViewController:rootController];

Где ваш файл XIB выглядит так:

  • Владелец файла (для класса установлено значение MyRootViewController, точка просмотра подключена к следующему UIView)
  • UIView
    • Subview A
    • Subview B

После того, как вы освоитесь с тем, как все это работает, вы можете также рассмотреть возможность создания контроллера навигации и контроллера корневого представления в одном файле XIB, как вы начали делать в опубликованном вами коде.

1 голос
/ 20 апреля 2011

Суть этого вопроса сформулирована самим Трэвисом: «Как бы вы загрузили перо Navigation Controller, максимально спроектировав в Интерфейсном Разработчике? А также из примера это выглядит так, как будто это означает UINavigationController и связанные UIViewControllers.

При такой интерпретации ответ заключается в том, что вы не можете полностью сконфигурировать UINavigationController и его UIViewController в одной XIB. Да, интуитивно хотеть сделать это, чтобы не сходить с ума.

Когда я говорю, что вы не можете сделать это, я имею в виду, что наиболее часто используемые методы фреймворка не имеют способа справиться с этим. Нет [UINavigationController alloc] initWithMegaNibName . Да, вы можете собрать практически все в одной XIB и написать код для гидратации объектов особым образом, но я не думаю, что это то, что вы ищете.

Вы можете использовать два или более XIB, как предложил Джон, но тогда все станет менее автономным, и поэтому у вас будет множество людей, которым будет проще выполнять часть или все контроллеры в коде.

К сожалению, между возможностями Интерфейсного Разработчика и кодом нет соответствия 1: 1, как на других платформах разработчиков. Я обычно предпочитаю иметь возможность позволить проектировщикам как можно больше участвовать в создании ресурсов, но большинство из них, которые я знаю, не кодируют цель-c.

0 голосов
/ 02 июня 2009

В IB в кончике MenuController добавьте UIView и установите это представление как выход. Вам нужно будет установить это представление для UIViewController. Здесь - быстрая ссылка на страницу Apple, показывающую основные настройки. Не уверен, что это поможет вам на вашем текущем этапе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...