Невозможно назначить несколько кнопок UINavigationItem при использовании раскадровки с iOS 5

Я разработчик iOS с большим опытом разработки интерфейса с помощью кода.

Теперь я тестирую функциональность раскадровки, потому что я тестирую, чтобы переключиться на «дизайн» пользовательского интерфейса, а затем реализовать его. Раньше я придерживался больших ограничений, используя nib / xib, и поэтому мне никогда не удастся с этим переключателем. Итак, вот новая попытка с storyboading 🙂

Теперь мой вопрос – я разрабатываю iPad Storyboard с навигационным контроллером и контроллером Tableview. Я хочу добавить несколько UIBarButtonItems, но я могу просто добавить один для каждой стороны с помощью Interface Builder.

Код будет выглядеть так:

UIBarButtonItem *b = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:nil action:nil]; UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; spacer.width = 20; self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:self.editButtonItem, spacer, b, nil]; 

Но почему я не могу добавить несколько кнопок с помощью IB? Есть только выходы для leftBarButtonItem, rightBarButtonItems, backBarButtonItems …

Это сводит меня с ума

Благодаря!

6 Solutions collect form web for “Невозможно назначить несколько кнопок UINavigationItem при использовании раскадровки с iOS 5”

РЕДАКТИРОВАТЬ

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

С более поздними версиями Xcode, конечно, решение, введенное @ecotax, а затем более подробный ответ @ShimanskiArtem – это те, которые будут использоваться.


У меня была та же проблема, что и вы, и я нашел следующий трюк

Предположим, у вас есть navigationController, в котором вы хотели бы иметь несколько кнопок. С iOS 5 вы можете назначить массив. Проблема в том, что вы теряете все преимущества использования раскадровки, поскольку это будет сделано программно.

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

В текущем представлении (а не в контроллере навигации), где вы хотите, чтобы кнопки отображались, покажите панель инструментов, изменив

bottomBar = выводится на bottomBar = панель инструментов.

введите описание изображения здесь

Внизу появится панель инструментов. Добавьте UIBarButtons к этой панели. Свяжите их с другими контроллерами представлений, используя segues и т. Д. …

в вашем .h файле создайте розетку для каждой кнопки

 @property (strong, nonatomic) IBOutlet UIBarButtonItem *Button1; @property (strong, nonatomic) IBOutlet UIBarButtonItem *Button2; @property (strong, nonatomic) IBOutlet UIBarButtonItem *Button3; 

Затем в вашем viewDidLoad () переместите кнопки на панель навигации и скройте панель инструментов. Добавьте их в порядке, обратном порядку, который вы хотите увидеть

 self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:self.Button3, self.Button2, self.Button1, nil]; self.navigationController.toolbarHidden = YES; 

И у вас есть несколько кнопок в панели навигации.

введите описание изображения здесь

введите описание изображения здесь

и результат в симуляторе

введите описание изображения здесь

введите описание изображения здесь

Я нашел легкое решение.

1) Добавьте следующую категорию:

 @interface UINavigationItem(MultipleButtonsAddition) @property (nonatomic, strong) IBOutletCollection(UIBarButtonItem) NSArray* rightBarButtonItemsCollection; @property (nonatomic, strong) IBOutletCollection(UIBarButtonItem) NSArray* leftBarButtonItemsCollection; @end @implementation UINavigationItem(MultipleButtonsAddition) - (void) setRightBarButtonItemsCollection:(NSArray *)rightBarButtonItemsCollection { self.rightBarButtonItems = [rightBarButtonItemsCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]]; } - (void) setLeftBarButtonItemsCollection:(NSArray *)leftBarButtonItemsCollection { self.leftBarButtonItems = [leftBarButtonItemsCollection sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"tag" ascending:YES]]]; } - (NSArray*) rightBarButtonItemsCollection { return self.rightBarButtonItems; } - (NSArray*) leftBarButtonItemsCollection { return self.leftBarButtonItems; } @end 

2) Добавьте свои элементы для просмотра контроллера (элементы будут отсортированы по возрастанию по тегу)

введите описание изображения здесь

3) Подключите свои элементы с rightBarButtonItemsCollection коллекции leftBarButtonItemsCollection или rightBarButtonItemsCollection для UINavigationItem

введите описание изображения здесь

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

введите описание изображения здесь

или в текстовом обзоре слева:

введите описание изображения здесь

Присвоение свойств массиву в viewDidLoad остается, как объясняется HpTerm; Единственное отличие – нет никакой фиктивной панели инструментов, чтобы скрыть больше.

В Xcode7 можно добавить несколько кнопок в UINavigationItem непосредственно в раскадровку, не создавая IBOutlet. просто перетащите несколько UIBarItems в левую или правую часть элемента навигации.

Добавление нескольких элементов UIBarItems в элемент навигации

@jchnxu, если вы уже не поняли, как закончить решение @Shimanski Artems, перейдите в доски объявлений и перетащите элемент кнопки панели в контроллер просмотра. У вас есть панель навигации и перетащите ее в раздел, где есть значки выхода и ответа над значком аккумулятора. Оттуда вы можете прикрепить их к коллекциям

Парень, попробуй!

 self.navigationItem.rightBarButtonItems = @[self.editButtonItem, spacer, b]; 
  • Как вручную установить «Назад» в приложениях iOS
  • Изменить BackBarButtonItem для всех UIViewControllers?
  • Размер кнопки кнопки iOS 5
  • Ошибка iOS при настройке элементов навигации
  • Элемент панели управления, не отображаемый в навигацииBar
  • обратный вызов обратной кнопки в navigationController в iOS
  • Как создать панель навигации с кнопкой «Назад» на ней?
  • Навигация UIBarButtonItem Внешний вид на устройстве отличается
  • UINavigationItem titleView проблема позиционирования
  • настраивать пользовательскую панель заднего планшета универсально без заголовка
  • UINavigationItem Prompt Issue
  • Interesting Posts

    Обсуждение лучшей практики: когда вы предпочитаете веб-просмотр через собственный пользовательский интерфейс в титане?

    Укажите URL-адрес в html для параметра закладки на iPhone.

    Запрос на отправку HTTPS в IOS

    Список классов в проекте Objective-c

    Как отсортировать результаты CloudKit по дате изменения?

    Невозможно присвоить значение типа '() -> Void' to '(() -> Void)!'

    Изменение размера содержимого UITableViewCell при появлении кнопки удаления

    Как кэшировать AVPlayerItem (видео) для повторного использования в UITableview

    Команды разработки iOS и сертификаты

    Codesign возвращает неизвестную ошибку -1 = ffffffffffffffff

    iOS UIActionSheet, представленный с жестов LongPress на кнопке, ошибочно требует двойных щелчков, чтобы отклонить

    Эффективные пользовательские плиточные карты с настраиваемыми уровнями масштабирования и коэффициентами масштабирования

    При записи с использованием UIAutomation на устройстве он зависает на «Start Capture …». Прекрасно работает на Simulator

    Экран iOS постоянно обновляется, используя затухание голоса UIAccessibility

    Как добавить объекты в UIScrollView, выходящие за пределы UIView из Storyboard?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.