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

Как программно заменить элементы UIToolBar, встроенные в IB

У меня есть панель инструментов с различными кнопками изображения, созданная в Interface Builder.

Я хотел бы иметь возможность программно заменить одну из кнопок индикатором активности при нажатии, а затем вернуть исходную кнопку, но при завершении операции изменить ее цвет от белого до желтого.

Возможно ли это с помощью встроенной панели инструментов IB или я должен смотреть на создание всей панели инструментов программным и пользовательским представлениями?

4b9b3361

Ответ 1

Вот пример того, что я сделал в подобной ситуации. Я хотел бы создать панель инструментов с помощью Interface Builder, но переключить один из BarButtonItems на основе того, был ли он "проверен". В этом примере есть несколько ключевых замечаний. Следующие переменные-члены определены для класса в файле заголовка:

NSMutableArray *toolbarItems;
IBOutlet UIToolbar *toolbar;
NSUInteger checkUncheckIndex;

Когда я хочу обновить проверенное состояние, я вызываю эту функцию... Обратите внимание, что существует селектор, определенный как checkUncheckClicked, который вызывается, когда нажата конкретная кнопка в UIToolbar. И UIToolbar настроен как IBOutlet на панель инструментов. В качестве альтернативы вы можете подключить UIBarButtonItem в качестве самой розетки и использовать это как свою логику для определения индекса кнопки или, если на то пошло, вы можете жестко закодировать индекс кнопки, если с течением времени ситуация не изменится. Наконец, есть check.png и unchecked.png, чтобы чередовать между тем, что включено в проект.

- (void)updateBarButtonItemChecked:(BOOL)checked {
    if (toolbarItems == nil) {
        toolbarItems = [[NSMutableArray arrayWithArray:toolbar.items] retain];
        checkUncheckIndex = -1;

        for (NSUInteger i = 0; i < [toolbarItems count]; i++) {
            UIBarButtonItem *barButtonItem = [toolbarItems objectAtIndex:i];
            if (barButtonItem.action == @selector(checkUncheckClicked)) {
                favoriteIndex = i;
                break;
            }
        }
    }

    if (checkUncheckIndex != -1) {
        UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:checked ? @"checked.png" : @"unchecked.png"] 
                                                                           style:UIBarButtonItemStylePlain target:self action:@selector(checkUncheckClicked)] autorelease];
        [toolbarItems replaceObjectAtIndex:checkUncheckIndex withObject:barButtonItem];

        toolbar.items = toolbarItems;
    }
}

И, конечно, toolbarItems и панель инструментов должны быть выпущены в вашем dealloc для класса.

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

Ответ 2

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

В вашем представлении контроллер объявляет 1 или более наборов элементов UIBarButtonItem, поскольку объекты свойств также объявляют и подключают панель инструментов в качестве свойства UIToolbar. Также объявите 1 или более массивов для хранения элементов.

В реализации В viewDidLoad выберите и настройте UIBarButtonItems, например

       playButton = [[UIBarButtonItem alloc]
         initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
    target:self 
action:@selector(handlePlayClick)];

Гибкие кнопки (для выравнивания и т.д.) объявляются следующим образом

   flexButton1 =[[UIBarButtonItem alloc]
 initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
target:nil action:nil];

Существует несколько initMethods для обработки различных типов панелей инструментов. Все следуют синтаксису, подобному приведенному выше. Стоит отметить целевые параметры и настройки действий. Цель: обычно будет self, action - это название функции, которую должна запускать кнопка.

После того, как ваши UIBarButtons добавят их в массив с помощью initWithObjects.

Затем, чтобы назначить кнопки на панели инструментов, вы вызываете

[toolbar setItems:<array name>];

Не забудьте освободить свои UIBarButtons и массивы в конце вашего кода.

Надеюсь, это поможет. Если вам нужно больше кода, дайте мне знать.

Богатый D.

Ответ 3

У Swift намного проще. В моем случае я переключаю кнопку воспроизведения с кнопкой паузы при каждом касании.

@IBAction func playandPause(sender: UIBarButtonItem) { // Here we are creating an outlet. Hook this up to the bar button item.
    for (index, button) in toolbarItems!.enumerate() { // Enumerating through all the buttons
        if button === sender { // === operator is used to check if the two objects are the exact same instance in memory.
            var barButtonItem: UIBarButtonItem!
            if mediaplayer.playing {
                mediaplayer.pause()
                barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Play, target: self, action: #selector(playandPause(_:)))
            }else {
                mediaplayer.play()
                barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Pause, target: self, action: #selector(playandPause(_:)))
            }
            toolbarItems![index] = barButtonItem // Replace the old item with the new item.
            break // Break once we have found the button as it is unnecessary to complete the rest of the loop
        }
    }
}

Ответ 4

Я думаю, это должно быть возможно. Вы можете либо попытаться создать IBOutlet для этой конкретной кнопки в вашем классе ViewController, и подключить кнопку от IB к этой розетке, либо вы можете использовать свойство items этого экземпляра UIToolbar (у вас есть ссылка на это, не так ли вы?) и найдите там соответствующий элемент, создайте новый NSArray с измененными элементами и верните его в свойство toolbar.items.

НТН

Ответ 5

Swift

Многое изменилось, так как эти ответы были опубликованы. Вот решение Swift 2.0.

Неважно, как исходный UIBarButtonItem, который вы заменяете, был создан программно. Все, что вам нужно - это выход UIToolbar. Чтобы заменить, скажем, второй элемент слева, выполните следующее:

var toolbarItems = self.toolbar.items
let newItem = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "play")
toolbarItems![1] = newItem
self.toolbar.setItems(toolbarItems, animated: true)

Ответ 6

Заметка об этом - панель инструментов вычеркнет любой цвет в ваших значках, так что вы все равно не сможете сделать его желтым. Вам нужно будет изменить форму изображения, чтобы указать "on".

В качестве альтернативы вам нужно будет загружать ваши элементы BarButtonIit с помощью UIButtons (используйте initWithCustomView) и соответствующим образом настроить образ кнопки.

НТН

Ответ 7

Try:

- (void)setTitle:(NSString *)title forItem:(int)item ofToolbar:(UIToolbar *)tb {
    NSMutableArray *newItems = [tb.items mutableCopy];
    UIBarButtonItem *old = [newItems objectAtIndex:1],
    *titled = [[UIBarButtonItem alloc] initWithTitle:title style:old.style target:old.target action:old.action];

    [newItems  replaceObjectAtIndex:1 withObject:titled];
    tb.items = newItems;

    [titled release];
}

Ответ 8

Для всей панели инструментов, созданной в IB (то есть не отдельных элементов панели инструментов), создайте IBOutlet:

@IBOutlet weak var toolbarThatYouMade: UIToolbar!

Это массив отдельных элементов панели инструментов, поэтому вы можете получить доступ к самому крайнему члену (например) с индексом [0]:

toolbarThatYouMade.items![0].image = UIImage(named: "New Image")

Этот код предполагает, что у вас есть изображение с именем "Новое изображение" в ваших активах.

Затем вы можете инициировать изменение изображения для элемента панели инструментов без необходимости доступа к этому самому конкретному элементу; например, если вы использовали это для чего-то вроде медиаплеера, вы можете переключать паузы/воспроизведение изображений с:
a) сама кнопка "Пауза/Воспроизведение",
б) кнопка "Стоп",
c) когда вы уведомлены об изменении состояния игрока,
или
г) что-то еще. (Будьте смелы! Будьте смелыми! Будьте чем-то другим, начинающимся с "b"!)