Не удается назначить несколько кнопок для 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 в левый или правый раздел элемента навигации.

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

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

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

self.navigationItem.rightBarButtonItems = @[self.editButtonItem, spacer, b];
Другие вопросы по тегам