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

Как скрыть/показать правую кнопку на панели навигации

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

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

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

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

4b9b3361

Ответ 1

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

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;

Ответ 2

Для Swift 3

if let button = self.navigationItem.rightBarButtonItem {
                    button.isEnabled = false
                    button.tintColor = UIColor.clear
                }`

Ответ 3

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

current_controller_in_navcontroller.navigationItem.rightBarButtonItem =  nil;

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

Ответ 4

Показать:

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

Скрыть

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

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

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

    }];

Ответ 5

Здесь решение Matt обновлено для раскадровки и ARC. Помните, что IBOutlets по умолчанию являются __weak, поэтому вам нужно изменить это на сильное, чтобы оно не было выпущено слишком рано.

@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

Ответ 6

SWIFT 2.2

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

Кроме того, следующее предложение не помогло мне использовать Xcode 7.3 и swift 2.2

 nav.leftBarButtonItem?.customView?.hidden = true

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

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

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

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

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

    if (nav.leftBarButtonItem == nil) {
        nav.leftBarButtonItem = sav_settingItem
        nav.leftBarButtonItems?.append(sav_logoItem)
        return
    }
    

Ответ 7

Кредит должен перейти на learner для ответа, который отвечает на этот вопрос:

скрывать и показывать кнопку левой панели навигации по требованию в 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...., и ничего не работало, пока я не нашел это.

Ответ 8

Показать:

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

Скрыть

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

Ответ 9

Swift 2:

Trick!

Скрыть

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"
}

Ответ 10

Мое решение:

self.navigationItem.rightBarButtonItem.customView.hidden=NO;

Ответ 11

В 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() функции, используйте hideNavigationButton() чтобы скрыть, и showNavigationButton() чтобы показать кнопку.

С уважением!

Ответ 12

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

self.navigationItem.rightBarButtonItem = nil;

Предположим, если у вас есть кнопка с несколькими кнопками справа, например, у вас есть два элемента кнопки панели (кнопка поиска и кнопка фильтра) с правой стороны вашего элемента навигации. Теперь правая панель кнопок

self.navigationItem.rightBarButtonItems = [searchItem, filterItem]

и вы должны скрыть только кнопку поиска, вы можете использовать как,

self.navigationItem.rightBarButtonItems = [filterItem]

Теперь, что происходит, вы можете полностью скрыть кнопку поиска от элемента навигации, и элемент фильтра появляется на месте элемента поиска.

Ответ 13

Показать:

//set navigationItem tint color white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor whiteColor];

Скрыть

//set navigationItem tint clear white
self.navigationItem.rightBarButtonItem.tintColor = [UIColor clearColor];

Ответ 14

Чтобы скрыть:

if let topItem = self.navigationController?.navigationBar.topItem {
    topItem.rightBarButtonItem = nil
}

Ответ 15

  • Предположим, вы можете ссылаться на конкретную кнопку панели как переменную xxxButton

(пожалуйста, откройте "Редактор помощника", "Управление" + "Перетащите xxx" в класс "YourViewController" как "xxxButton" ).

или вы можете использовать что-то вроде let xxxButton = navigationBar.buttons[1]

  1. Скрыть xxxButton.customView = UIView() или navigationItem.rightBarButtonItems?.remove(at: (navigationItem.rightBarButtonItems?.index(of:xxxButton)!)!)

  2. Показать xxxButton.customView = nil или navigationItem.rightBarButtonItems?.insert(newElement: xxxButton, at:SOME_INDEX)

Надеюсь на помощь.

Ответ 16

Сначала установите заголовок пустым, а после swlwction просто установите снова.

Ответ 17

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

    self.navigationItem.rightBarButtonItem?.image = nil
    self.navigationItem.rightBarButtonItem?.isEnabled = false