Не удается назначить несколько кнопок для UINavigationItem при использовании раскадровки с iOS 5
Я разработчик для 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 ответов
РЕДАКТИРОВАТЬ
В то время, когда я отвечал на этот вопрос, XCode не предлагал возможность связывать добавленные кнопки в раскадровке. Представленная уловка позволила все еще иметь сегменты, разработанные в раскадровке.
С более свежими версиями Xcode наверняка будут использоваться решение, представленное @ecotax, а затем более подробный ответ @ShimanskiArtem.
У меня была та же проблема, что и у вас, и я нашел следующий трюк
Предположим, у вас есть навигационный контроллер, в котором вы хотели бы иметь несколько кнопок. Начиная с iOS 5 вы можете назначить массив. Проблема в том, что вы теряете все преимущества использования раскадровки, как это будет сделано программно.
Я использовал следующий трюк. Обычно, когда вы хотите использовать несколько кнопок на панели навигации, вам не нужна панель инструментов.
В текущем представлении (не в контроллере навигации), где вы хотите, чтобы кнопки появлялись, покажите панель инструментов, изменив
bottomBar = выведено на bottomBar = панель инструментов.
Панель инструментов появится внизу. Добавьте 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;
И вуаля у вас есть несколько кнопок на панели навигации
и результат в симуляторе
Я нашел простое решение.
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) Соедините ваши предметы с leftBarButtonItemsCollection
или же rightBarButtonItemsCollection
Аутлет коллекция UINavigationItem
Я хотел последовать совету HpTerm, но в моем приложении у меня есть и панель инструментов, и панель навигации.
Я обнаружил, что метод, изложенный в его / ее комментарии, может быть легко обобщен для поддержки этого случая. Вместо добавления фиктивной панели инструментов, вы можете просто добавить кнопки на том же уровне, что и контроллер представления, либо перетащив их на черную полосу ниже:
или в текстовом обзоре, отображаемом слева:
Присвоение свойств массиву в viewDidLoad остается, как объяснил HpTerm; единственная разница в том, что там нет фиктивной панели инструментов, чтобы скрыть больше.
В Xcode7 можно добавить несколько кнопок в UINavigationItem непосредственно в раскадровке без создания IBOutlet. просто перетащите несколько элементов UIBarItem в левый или правый раздел элемента навигации.
@jchnxu, если вы уже не разобрались, как закончить решение @Shimanski Artems, перейдите на доски раскадровок и перетащите элемент кнопки панели на контроллер представления, в котором у вас есть панель навигации, и перетащите его в раздел, где у вас есть значки выхода и ответчика. над значком батареи. Оттуда вы можете прикрепить их к коллекциям
Человек, попробуйте это!
self.navigationItem.rightBarButtonItems = @[self.editButtonItem, spacer, b];