Как скрыть / показать правую кнопку в панели навигации - PullRequest
38 голосов
/ 08 апреля 2011

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

К сожалению, следующее не работает:

NO GOOD: self.navigationItem.rightBarButtonItem.hidden = YES;  // FOO CODE

Есть ли способ?

Ответы [ 17 ]

73 голосов
/ 08 апреля 2011

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

UIBarButtonItem *oldButton = self.navigationItem.rightBarButtonItem;
[oldButton retain];
self.navigationItem.rightBarButtonItem = nil;

//... later
self.navigationItem.rightBarButtonItem = oldButton;
[oldButton release];

Лично,в моих приложениях я делаю свои навигационные кнопки в @properties, чтобы я мог мусор и воссоздать их по желанию, так что-то вроде:

//mycontroller.h
UIBarButtonItem *rightNavButton;
@property (nonatomic, retain) UIBarButtonItem *rightNavButton;

//mycontroller.m
@synthesize rightNavButton;
- (UIBarButtonItem *)rightNavButton {
    if (!rightNavButton) {
        rightNavButton = [[UIBarButtonItem alloc] init];
        //configure the button here
    }
    return rightNavButton;
}

//later, in your code to show/hide the button:
self.navigationItem.rightBarButtonItem = self.rightNavButton;
12 голосов
/ 23 марта 2017

для Swift 3

if let button = self.navigationItem.rightBarButtonItem {
                    button.isEnabled = false
                    button.tintColor = UIColor.clear
                }`
9 голосов
/ 08 апреля 2011

Установить ссылку на nil:

current_controller_in_navcontroller.navigationItem.rightBarButtonItem =  nil;

Также обязательно вызывайте ее в контроллере, показанном в данный момент navController, а не в самом navController.

7 голосов
/ 15 октября 2013

Показать:

[self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];

Hide:

[self.navigationItem.rightBarButtonItem.customView setAlpha:0.0];

Вы даже можете анимировать его показ / скрытие

[UIView animateWithDuration:0.2 animations:^{
        [self.navigationItem.rightBarButtonItem.customView setAlpha:1.0];

    }];
5 голосов
/ 21 июля 2013

Вот решение Мэтта, обновленное для раскадровок и ARC.Помните, что по умолчанию IBOutlets __Слабый, поэтому вам нужно изменить его на сильный, чтобы он не был выпущен слишком рано.

@interface MAGTableViewController () <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UIBarButtonItem *rightBarButton;

@end

@implementation MAGTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.navigationItem setRightBarButtonItem:nil];
}

- (IBAction)rightBarButtonItemTapped:(id)sender
{
    [self.view endEditing:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self.navigationItem setRightBarButtonItem:self.rightBarButton];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self.navigationItem setRightBarButtonItem:nil];
}

@end
4 голосов
/ 02 сентября 2016

SWIFT 2.2

В swift 2.2 self.navigationItem не работает. Вместо этого создайте выход NavigationItem (я назвал его ниже "nav") и используйте его.

Также следующее предложение не сработало для меня, используя Xcode 7.3 и swift 2.2

 nav.leftBarButtonItem?.customView?.hidden = true

Итак, я использовал приведенную выше идею @Matt J (у меня 2 элемента слева):

  1. Создание выходов для элементов на панели навигации и переменных для их хранения

    @IBOutlet weak var settingItem: UIBarButtonItem!
    @IBOutlet weak var logoItem: UIBarButtonItem!
    
    var sav_settingItem: UIBarButtonItem = UIBarButtonItem()
    var sav_logoItem: UIBarButtonItem = UIBarButtonItem()
    
  2. Сохранение элементов в viewDidLoad ()

    sav_settingItem = nav.leftBarButtonItems![0]
    sav_logoItem = nav.leftBarButtonItems![1]
    
  3. Чтобы скрыть, установите их на ноль

    nav.leftBarButtonItem = nil
    nav.leftBarButtonItem = nil
    
  4. ПОКАЗАТЬ их

    if (nav.leftBarButtonItem == nil) {
        nav.leftBarButtonItem = sav_settingItem
        nav.leftBarButtonItems?.append(sav_logoItem)
        return
    }
    
4 голосов
/ 03 декабря 2014

Кредит должен идти к ученику за этот ответ, ответ на этот вопрос:

скрыть и показать левую кнопку панели навигации по требованию в iOS-7

Это ответ, который гораздо проще.

//hide and reveal bar buttons
-(void) hideAndDisableLeftNavigationItem
{
    [self.navigationItem.leftBarButtonItem setTintColor:[UIColor clearColor]];
    [self.navigationItem.leftBarButtonItem setEnabled:NO];
}

-(void) showAndEnableLeftNavigationItem
{
    [self.navigationItem.leftBarButtonItem setTintColor:[UIColor blueColor]];
    [self.navigationItem.leftBarButtonItem setEnabled:YES];
}

Тогда вы просто ссылаетесь на метод, где вам это нужно, как внутри (IBAction), например, так:

[self hideAndDisableLeftNavigationItem];//[self showAndEnableLeftNavigationItem]; to show again

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

3 голосов
/ 05 марта 2017

Показать:

[self.navigationItem.rightBarButtonItem.customView setHidden:NO];

Hide:

[self.navigationItem.rightBarButtonItem.customView setHidden:YES];
2 голосов
/ 15 марта 2017

Swift 2 :

Трюк!

Скрыть:

if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
        btn.enabled = false
        btn.title = ""
}

Показать:

if let btn = self.tabBarController!.navigationItem.rightBarButtonItem {
        btn.enabled = true
        btn.title = "ButtonName"
}
1 голос
/ 27 октября 2018

В swift 4 У меня есть хитрость, чтобы показать / скрыть правую или левую кнопку:

Шаг 1: Создание кнопки IBOutlet в контроллере представления:

@IBOutlet var navigationItemButton: UIBarButtonItem!

Шаг 2: Функция создания кнопки «Скрыть»:

func hideNavigationButton() {
    navigationItemButton.isEnabled = false
    navigationItemButton.tintColor = UIColor.clear
}

Шаг 3: Функция создания кнопки «Показать»:

func showNavigationButton() {
    navigationItemButton.isEnabled = true
    navigationItemButton.tintColor = UIColor.white
}

Шаг 4 : просто вызовите нужные функции, используйте hideNavigationButton(), чтобы скрыть, и showNavigationButton(), чтобы показать кнопку.

Привет!

...