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


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, если я установлю это на нуль, я не уверен, как я верну его).




@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

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

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




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

Для UINavigationBar :

self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil



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




Один из способов сделать это - использовать свойство initWithCustomView:(UIView *) при распределении UIBarButtonItem . Подкласс для UIView будет иметь свойство hide / unhide.

Например:

1. Имейте UIButton который вы хотите скрыть / показать.

2. Сделайте UIButton как пользовательское представление. Подобно :

UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button

UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];

3. Вы можете скрыть / myButton созданный вами myButton . [myButton setHidden:YES];




С благодарностью @lnafziger, @MindSpiker, @vishal, et. аль,

Самый простой один вкладыш, к которому я пришел, для одной правой (или левой) кнопки бара:

self.navigationItem.rightBarButtonItem = <#StateExpression#>
    ? <#StrongPropertyButton#> : nil;

Как в:

@interface MyClass()

@property (strong, nonatomic) IBOutlet UIBarButtonItem *<#StrongPropertyButton#>;

@end

@implementation

- (void) updateState
{
    self.navigationItem.rightBarButtonItem = <#StateExpression#>
        ? <#StrongPropertyButton#> : nil;
}

@end

Я тестировал это, и он работает для меня (с сильным элементом кнопки на панели, подключенным через IB).




Я работал с xib и с UIToolbar. BarButtonItem был создан в файле xib. Я создал IBOutlet для BarButtonItem. И я использовал этот код, чтобы скрыть свой BarButtonItem

 self.myBarButtonItem.enabled = NO;
 self.myBarButtonItem.title =  nil;

это помогло мне.




В IB, если вы оставите заголовок кнопки пустым, он не появится (никогда не инициализирован?). Я делаю это часто во время разработки во время обновлений пользовательского интерфейса, если я хочу, чтобы элемент кнопки на панели исчезал для сборки без его удаления и уничтожения всех ссылок на выход.

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

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




Улучшение от ответа @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];



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




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

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



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

-(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;
    }
}



Я обнаружил еще одну tintColor в tintColor и isEnabled предложенном Максом и другими - когда VoiceOver включен для доступности, а кнопка логически скрыта, курсор доступности по-прежнему будет фокусироваться на кнопке бара и укажет, что он «затемнен» (т.е. потому что isEnabled установлен в значение false). Подход в принятом ответе не страдает от этого побочного эффекта, но другая работа вокруг меня заключалась в том, чтобы установить isAccessibilityElement в false при «скрытии» кнопки:

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

А затем установите для параметра isAccessibilityElement значение true, когда «показ» кнопки:

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

Наличие элемента кнопки на панели все еще занимает место, и это не было проблемой в моем случае, так как мы скрывали / показывали самые левые элементы правой панели.




Для 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




В настоящее время я запускаю 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];
    



Links