Как показать / скрыть UIBarButtonItem? [ios]


Answers

Я знаю, что этот ответ опаздывает на этот вопрос. Однако это может помочь, если кто-то другой столкнется с подобной ситуацией.

В iOS 7, чтобы скрыть элемент кнопки панели, мы можем использовать следующие два метода:

  • используйте SetTitleTextAttributes : - Это отлично работает на элементах панели кнопок, таких как «Готово», «Сохранить» и т. д. Однако он не работает с такими элементами, как «Добавить», «Корзина» и т. д. (по крайней мере, не для меня), поскольку они не являются текстами.
  • используйте TintColor : - Если у меня есть элемент кнопки на панели, называемый «deleteButton»: -

Чтобы скрыть кнопку, я использовал следующий код:

[self.deleteButton setEnabled:NO]; 
[self.deleteButton setTintColor: [UIColor clearColor]];

Чтобы снова отобразить кнопку, я использовал следующий код:

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
Question

Я создал панель инструментов в IB с несколькими кнопками. Я хотел бы иметь возможность скрывать / показывать одну из кнопок в зависимости от состояния данных в главном окне.

UIBarButtonItem нет скрытого свойства, и любые примеры, которые я нашел до сих пор для их скрытия, включают в себя установление кнопок навигации на nil, что я не думаю, что хочу здесь, потому что мне может понадобиться снова отобразить кнопку ( не говоря уже о том, что, если я подключу свою кнопку к IBOutlet, если я установлю это на нуль, я не уверен, как я верну его).




Можно скрыть кнопку на месте, не изменяя ее ширину или не удаляя ее из панели. Если вы установите стиль равным, удалите заголовок и отключите кнопку, он исчезнет. Чтобы восстановить его, просто измените свои изменения.

-(void)toggleBarButton:(bool)show
{
    if (show) {
        btn.style = UIBarButtonItemStyleBordered;
        btn.enabled = true;
        btn.title = @"MyTitle";
    } else {
        btn.style = UIBarButtonItemStylePlain;
        btn.enabled = false;
        btn.title = nil;
    }
}



В настоящее время я запускаю OS X Yosemite Developer Preview 7 и Xcode 6 beta 6, ориентируясь на iOS 7.1, и следующее решение отлично подходит для меня:

  • Создать выход для UINavigationItem и UIBarButtonItem s
  • Выполнить следующий код для удаления

    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
  • Запустите следующие коды, чтобы снова добавить кнопки

    [self.navItem setRightBarButtonItem:deleteItem];
    [self.navItem setLeftBarButtonItem:addItem];



Для Swift 3 и Swift 4 вы можете сделать это, чтобы скрыть UIBarButtomItem :

self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear

И чтобы показать UIBarButtonItem :

self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue

На tintColor вам необходимо указать цвет начала, который вы используете для UIBarButtomItem




self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];




@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

            isEnabled = !isHidden
            tintColor = isHidden ? UIColor.clear : UIColor.black
        }
    }
}

И теперь просто измените свойство isHidden .




Улучшение от ответа @lnafziger

Сохраните Barbuttons в сильной розетке и сделайте это, чтобы скрыть / показать его:

-(void) hideBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you remove the button from the toolbar and animate it
    [navBarBtns removeObject:myButton];
    [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}


-(void) showBarButtonItem :(UIBarButtonItem *)myButton {
    // Get the reference to the current toolbar buttons
    NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];

    // This is how you add the button to the toolbar and animate it
    if (![navBarBtns containsObject:myButton]) {
        [navBarBtns addObject:myButton];
        [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
    }
}

Когда когда-либо потребуется использование ниже Функция ..

[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];



Это длинный путь вниз по списку ответов, но на всякий случай кто-то хочет получить легкую копию и вставить для быстрого решения, вот оно

func hideToolbarItem(button: UIBarButtonItem, withToolbar toolbar: UIToolbar) {
    var toolbarButtons: [UIBarButtonItem] = toolbar.items!
    toolbarButtons.removeAtIndex(toolbarButtons.indexOf(button)!)
    toolbar.setItems(toolbarButtons, animated: true)
}

func showToolbarItem(button: UIBarButtonItem, inToolbar toolbar: UIToolbar, atIndex index: Int) {
    var toolbarButtons: [UIBarButtonItem] = toolbar.items!
    if !toolbarButtons.contains(button) {
        toolbarButtons.insert(button, atIndex: index)
        toolbar.setItems(toolbarButtons, animated:true);
    }
}



Если UIBarButtonItem имеет изображение вместо текста в нем, вы можете сделать это, чтобы скрыть его: navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;




Вы можете легко получить представление и скрыть его таким образом

let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true



Для версии Swift приведен код:

Для UINavigationBar :

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil



Вам нужно манипулировать массивом toolbar.items.

Вот какой код я использую, чтобы скрыть и отобразить кнопку «Готово». Если ваша кнопка находится на крайнем краю панели инструментов или между другими кнопками, ваши другие кнопки будут перемещаться, поэтому, если вы хотите, чтобы ваша кнопка просто исчезла, поместите вашу кнопку в качестве последней кнопки в центр. Я одушевляю движение кнопки для эффекта, мне это очень нравится.

-(void)initLibraryToolbar {

    libraryToolbarDocumentManagementEnabled = [NSMutableArray   arrayWithCapacity:self.libraryToolbar.items.count];
    libraryToolbarDocumentManagementDisabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
    [libraryToolbarDocumentManagementEnabled addObjectsFromArray:self.libraryToolbar.items];
    [libraryToolbarDocumentManagementDisabled addObjectsFromArray:self.libraryToolbar.items];
    trashCan = [libraryToolbarDocumentManagementDisabled objectAtIndex:3];
    mail = [libraryToolbarDocumentManagementDisabled objectAtIndex:5];
    [libraryToolbarDocumentManagementDisabled removeObjectAtIndex:1];
    trashCan.enabled = NO;
    mail.enabled = NO;
    [self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:NO];

}

поэтому теперь вы можете использовать следующий код, чтобы показать свою кнопку

[self.libraryToolbar setItems:libraryToolbarDocumentManagementEnabled animated:YES];
trashCan.enabled = YES;
mail.enabled = YES; 

или скрыть вашу кнопку

[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES];
trashCan.enabled = NO;
mail.enabled = NO;



Я добавлю свое решение здесь, поскольку пока не нашел его здесь. У меня есть динамическая кнопка, изображение которой зависит от состояния одного элемента управления. Самое простое решение для меня состояло в том, чтобы установить изображение в nil если элемент управления отсутствует. Изображение обновлялось каждый раз, когда элемент управления обновлялся, и, таким образом, это было оптимально для меня. Просто, чтобы быть уверенным, что я также установил, что enabled NO .

Установка ширины на минимальное значение не работала на iOS 7.




Подкласс UIBarButtonItem . Убедитесь, что кнопка в Interface Builder установлена ​​в HidableBarButtonItem . Сделайте выход от кнопки до контроллера вида. С помощью контроллера просмотра вы можете скрыть / показать кнопку, вызвав setHidden:

HidableBarButtonItem.h

#import <UIKit/UIKit.h>

@interface HidableBarButtonItem : UIBarButtonItem

@property (nonatomic) BOOL hidden;

@end

HidableBarButtonItem.m

#import "HidableBarButtonItem.h"

@implementation HidableBarButtonItem

- (void)setHidden:(BOOL const)hidden {
    _hidden = hidden;

    self.enabled = hidden ? YES : NO;
    self.tintColor = hidden ? [UIApplication sharedApplication].keyWindow.tintColor : [UIColor clearColor];
}

@end



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

barButton.enabled = false
barButton.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: .Normal)

Также см. Мое решение с расширением UIBarButtonItem для аналогичного вопроса: Сделать UIBarButtonItem disapear с помощью быстрой IOS