Настройка элементов панели инструментов UINavigationController

В iPhone OS 3.0 вы можете установить элементы панели инструментов UINavigationController с помощью метода setToolbarItems:animated:. Однако для этого необходимо передать массив UIToolbarItems. Хотя я мог программно создавать эти элементы панели инструментов, я бы предпочел создать их в Интерфейсном Разработчике, если это возможно.

Имея это в виду, я создал UIToolbar в «MyGreatViewController.xib» и заполнил его необходимыми элементами панели инструментов. Затем в MyGreatViewController.m я беру элементы с панели инструментов и передаю их setToolbarItems:animated::

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setToolbarItems: [toolbar items]];
}

... где toolbar - это IBOutlet, относящийся к UIToolbar.

Это хороший подход? Есть ли лучший способ добиться этого? Должен ли я просто создавать элементы программно?


person Steve Harrison    schedule 22.08.2009    source источник
comment
Я чего-то не понимаю: вы говорите, что я получаю элементы с панели инструментов, но затем вы возвращаете их на панель инструментов? Разве они еще не отображаются?   -  person Oscar    schedule 09.12.2010


Ответы (2)


Это вполне приемлемый способ сделать это, но имейте в виду, что загрузка файлов xib на iPhone довольно затратна, и вполне может быть быстрее создавать элементы панели инструментов программно в вашем методе viewDidLoad.

person iKenndac    schedule 22.08.2009
comment
Здорово. Поскольку XIB уже загружается при инициализации класса контроллера представления (я проверил с помощью XIB для пользовательского интерфейса при создании файлов контроллера представления), этот подход не должен быть дороже, чем создание элементов панели инструментов программным способом. - person Steve Harrison; 22.08.2009
comment
Ах, если вы уже загружаете XIB, вы не добавите слишком много дополнительного времени. Разархивирование объектов из XIB дороже, чем их создание в коде, но если ваше представление не загружается долго, я бы не стал об этом беспокоиться. - person iKenndac; 22.08.2009

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

Например, вот что мы можем сделать (используя Xcode 3.2 на Snow Leopard):

  1. Файл-> Новый проект .... Выберите Приложение на основе навигации и создайте проект.
  2. Откройте MainWindow.xib в Интерфейсном Разработчике.
  3. Выберите контроллер навигации и в инспекторе атрибутов установите флажок «Показать панель инструментов». Это вызовет появление объекта панели инструментов.
  4. Перетащите элемент кнопки панели из библиотеки на панель инструментов. Он появится на панели инструментов. Если вы проверите иерархию в NIB, вы увидите, что этот новый элемент является дочерним по отношению к RootViewController.

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

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

person Kristopher Johnson    schedule 20.09.2009
comment
Я считаю, что так и должно быть. Вроде как UIViewController волшебным образом загружает его xib, если у него есть совпадающее имя файла. - person Sneakyness; 14.05.2010
comment
Оно работает! Я думаю, что это определенно лучший способ настроить панель инструментов в режиме навигации. - person Nathan; 24.09.2010
comment
В моем приложении у меня есть контроллер панели вкладок, и одна из вкладок - это navigationController - довольно стандартная конфигурация. Однако, если я последую тому, что предлагает Кристофер, после шага 3 панель инструментов появится за панелью вкладок в IB! И когда я пытаюсь выполнить шаг 4 (я пытался добавить элемент управления сегментом / кнопку), он просто не позволяет мне разместить его на панели инструментов. Я что-то упустил? - person Dev; 07.10.2010
comment
Я знаю, что это очень давно, но знаете ли вы, как это сделать для подпредставлений RootViewController? Другими словами, если в коде RootViewController я создаю FooController, который находится в его собственном наконечнике, и нажимаю его, то как я могу установить кнопки панели инструментов FooController в Interface Builder? - person iand675; 12.11.2010
comment
@ iand675 согласен, я также хотел бы знать, есть ли решение сделать это с помощью IB - person Nik; 07.05.2011