Подтвердить что ты не робот

Невозможно назначить несколько кнопок 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...

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

Спасибо!

4b9b3361

Ответ 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];