Невозможно назначить несколько кнопок 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...
Это сводит меня с ума. ¡¡¡
Спасибо!
Ответы
Ответ 1
ИЗМЕНИТЬ
В то время, когда я ответил на этот вопрос, Xcode не предлагал возможность связывать добавленные кнопки в раскадровке. Представленный трюк позволил по-прежнему иметь сегу, разработанную в раскадровке.
С более поздними версиями Xcode, конечно, решение, введенное @ecotax, а затем более подробный ответ @ShimanskiArtem - это те, которые будут использоваться.
У меня была та же проблема, что и вы, и я нашел следующий трюк
Предположим, что у вас есть navigationController, в котором вы хотели бы иметь несколько кнопок. С iOS 5 вы можете назначить массив. Проблема в том, что вы теряете все преимущества использования раскадровки, поскольку это будет сделано программно.
Я использовал следующий трюк. Обычно, когда вам нужно несколько кнопок на панели навигации, вам не нужна панель инструментов.
В текущем виде (не в навигационном контроллере), где вы хотите, чтобы кнопки отображались, покажите панель инструментов, изменив
bottomBar = выводится на панель bottomBar =.
![enter image description here]()
Внизу появится панель инструментов.
Добавьте UIBarButtons к этой панели. Свяжите их с другими контроллерами представлений с помощью segues и т.д.
в вашем .h файле создайте розетку для каждой кнопки
@property (strong, nonatomic) IBOutlet UIBarButtonItem *Button1;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *Button2;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *Button3;
Затем в вашем представленииDidLoad() переместите кнопки на панель навигации и скройте панель инструментов. Добавьте их в порядке, обратном порядку, который вы хотите увидеть.
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]()
Ответ 2
Я нашел простое решение.
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]()
Ответ 3
Я хотел следовать совету HpTerm, но в моем приложении у меня есть как панель инструментов, так и панель навигации.
Я обнаружил, что метод, описанный в его комментарии, может быть легко обобщен для поддержки этого дела.
Вместо добавления фиктивной панели инструментов вы можете просто добавить кнопки на том же уровне, что и контроллер просмотра, либо перетащив их в черную полосу ниже:
![enter image description here]()
или в текстовом обзоре слева:
![enter image description here]()
Назначение свойств массиву в viewDidLoad остается, как объясняется HpTerm; единственная разница заключается в том, что нет скрытой панели инструментов для скрытия.
Ответ 4
В Xcode7 можно добавить несколько кнопок в UINavigationItem непосредственно в раскадровке, не создавая IBOutlet. просто перетащите несколько UIBarItems в левую или правую часть элемента навигации.
![Добавление нескольких элементов UIBarItems в элемент навигации]()
Ответ 5
@jchnxu, если вы уже выяснили, как закончить решение @Shimanski Artems, перейдите в доски объявлений и перетащите элемент кнопки панели в контроллер просмотра, у вас есть панель навигации и перетащите ее в раздел, где у вас есть выход и значки ответчика над значком аккумулятора. Оттуда вы можете прикрепить их к коллекциям
Ответ 6
Человек, попробуйте это!
self.navigationItem.rightBarButtonItems = @[self.editButtonItem, spacer, b];