Показать / скрыть UIBarButtonItem, расположенный в середине UIToolbar - PullRequest
2 голосов
/ 06 марта 2012

Я прочитал пару похожих вопросов по этой теме в StackOverflow, но ни один из них не применим к моему делу.

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

(Button #1) (Button #2) (Button #3) <--- Flex Controller ---> (Button #4)

Какой самый эффективный способ показать / скрыть Button #3 UIBarButtonItem, поскольку он находится в середине панели UIToolbar?

FOLLOW-UP

Мне известен метод setItems:Animated, но кажется, что он может быть проблематичным, потому что все мои кнопки подключены через IB и имеют связанные с ними IBActions.

Значит ли это, что мне нужно найти способ сохранить мою кнопку № 3, когда она скрыта (поскольку я использую ARC?) Я ищу наиболее оптимальный / эффективный способ добавления и удаления этих кнопок. объекты. Если мне нужно будет заново создавать этот список каждый раз, когда мне нужно показать / скрыть кнопку # 3, это то, что я буду делать.

Это просто кажется неэффективным.

Ответы [ 5 ]

5 голосов
/ 06 марта 2012

Глядя на UIToolBar.h, есть следующий метод:

- (void)setItems:(NSArray *)items animated:(BOOL)animated;   // will fade in or out or reorder and adjust spacing

Вы должны просто иметь возможность сделать что-то вроде:

NSMutableArray *items = [toolBar.items mutableCopy];
[items removeObjectAtIndex:2];
[toolBar setItems:items animated:YES];

Посмотрите, работает ли это так, как вы 'ищем

4 голосов
/ 06 марта 2012

Я бы порекомендовал создать вспомогательную функцию следующим образом:

- (void) setToolbarItems:(BOOL) button3Shown {
    NSMutableArray *items = [NSMutableArray arrayWithCapacity:5];
    [items addObject:button1];
    [items addObject:button2];
    if(button3Shown) {
        [items addObject:button3];
    }
    [items addObject:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]];
    [items addObject:button4];
    [self.toolbar setItems:[items copy] animated:YES];
}

Преимущество в том, что он доступен, когда вам нужно его обновить, и тогда вы можете легко добавить / удалить кнопку.Для того, чтобы это работало, вам нужно, чтобы кнопки в вашем файле реализации были доступны как IBOutlets, и на них можно было бы легко ссылаться для перестройки панели инструментов.

0 голосов
/ 31 марта 2017

С существующими ссылками на элементы панели инструментов item1, item2 и item3 наиболее простым способом является удаление всех элементов, а затем добавление каждого элемента в нужном вам порядке.Этот код написан с точки зрения нахождения в подклассе UIToolbar:

let flexSpace: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let fixedSpace: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)

self.items?.removeAll()
self.items?.append(flexSpace)
self.items?.append(item1)
self.items?.append(fixedSpace)
self.items?.append(item3)
self.items?.append(fixedSpace)
self.items?.append(item2)

Эти ссылки на элементы могут быть из IBOutlets.Измените эти ссылки на более сильные, а не на слабые ссылки IB-вставки-по умолчанию, чтобы UIToolbar сохранял ссылки на эти элементы даже после их удаления, поддерживая тем самым соответствующие отношения функции IBAction.

Для удаленияопределенный элемент из вашего UIToolbar из подкласса UIToolbar, без необходимости переустанавливать все элементы:

if let index = self.items?.index(of: buttonToRemove) {
    self.items?.remove(at: index)
}

Если не в подклассе UIToolbar, просто замените self ссылкой на UIToolbar повсюду.

0 голосов
/ 28 января 2013

Создание различных массивов UIBarButtonItems и добавление / удаление в / из UIToolbar во время выполнения может увеличить сложность выполнения.

Я сделал это, используя другой подход.Вот фрагменты для достижения этого.

Шаг 1: Создайте IBOutlet или создайте экземпляр UIToolbar.

    UIToolbar *toolBar = [UIToolbar alloc] init];

Установите требуемые стили, если хотите.

Шаг 2. Создание экземпляров типа UIButton.

    UIButton *button1, *button2;

Шаг 3. Назначение изображений (если необходимо) кнопкам.

    button1 = [UIButton alloc] initWithFrame:CGRectMake(0.f,0.f,30.f,30.f);
    [button1 setBackgroundImage:[UIImage imageNamed:@"image1.png"] forState:UIControlStateNormal];

    button2 = [UIButton alloc] initWithFrame:CGRectMake(0.f,0.f,30.f,30.f);
    [button2 setBackgroundImage:[UIImage imageNamed:@"image2.png"] forState:UIControlStateNormal];

Шаг 4. Создание экземпляров UIBarButtonItem с указанными выше кнопками в качестве пользовательскихview.

    UIBarButtonItem *toolbarbuttonItem1 = [UIBarButtonItem alloc] initWithCustomView:button1];
    UIBarButtonItem *toolbarbuttonItem2 = [UIBarButtonItem alloc] initWithCustomView:button1];

Шаг 5: Назначить элементы панели кнопок на панели инструментов.

    toolBar.items = [NSArray arrayWithObjects:toolbarbuttonItem1,toolbarbuttonItem2,nil];

Шаг 6: Добавить панель инструментов в VIEW.

Шаг 7: Создайте UIButton IBOutlet в VIEW и назначьте событие click.

Вызовите следующий вспомогательный метод в событии click для переключения скрытия.

    - (void) toggleToolbarButtons {
           button1.hidden = !button1.hidden;
           button2.hidden = !button2.hidden;
    }

Надеюсь, это поможет !!

0 голосов
/ 06 марта 2012

Вам необходимо сбросить элементы панели инструментов, передав новый массив без кнопки, которую вы хотите скрыть. См. Скрыть UIToolbar UIBarButtonItems для точных деталей.

...