Не удается назначить несколько кнопок для UINavigationItem при использовании раскадровки с iOS 5 - PullRequest
25 голосов
/ 28 марта 2012

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

Сейчас я тестирую функциональность раскадровки, потому что я тестировал переключение на «дизайн» пользовательского интерфейса, а не его реализацию. В прошлом я придерживался многих ограничений, используя nib / xib's, и поэтому мне никогда не удавалось добиться успеха с переключателем. Итак, вот и новая попытка с рассказыванием историй:)

Теперь мой вопрос - я разрабатываю раскадровку iPad, в которой есть контроллер навигации и контроллер просмотра таблиц. Я хочу добавить несколько 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 ]

64 голосов
/ 06 декабря 2013

Я нашел простое решение.

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) Добавьте ваши элементы для просмотра контроллера (элементы будут отсортированы по возрастанию по тегу)

enter image description here

3) Соедините ваши вещи с leftBarButtonItemsCollection или rightBarButtonItemsCollection коллекцией розеток UINavigationItem

enter image description here

26 голосов
/ 18 декабря 2012

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

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

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


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

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

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

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

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

enter image description here

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

в вашем .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;

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

enter image description here

enter image description here

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

enter image description here

enter image description here

15 голосов
/ 10 июня 2013

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

enter image description here

или втекстовый обзор отображается слева:

enter image description here

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

3 голосов
/ 16 сентября 2015

В Xcode7 можно добавить несколько кнопок в UINavigationItem непосредственно в раскадровке без создания IBOutlet.просто перетащите несколько элементов UIBarItem в левый или правый раздел элемента навигации.

Adding Multiple UIBarItems to Navigation Item

0 голосов
/ 21 августа 2015

Человек, попробуйте это!

self.navigationItem.rightBarButtonItems = @[self.editButtonItem, spacer, b];
0 голосов
/ 18 ноября 2014

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

...