Как скрыть/показать правую кнопку на панели навигации
Мне нужно скрыть правую кнопку в панели навигации, а затем отобразить ее после выбора пользователем некоторых параметров.
К сожалению, следующее не работает:
NO GOOD: self.navigationItem.rightBarButtonItem.hidden = YES; // FOO CODE
Есть ли способ?
Ответы
Ответ 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]
-
Скрыть
xxxButton.customView = UIView()
или
navigationItem.rightBarButtonItems?.remove(at: (navigationItem.rightBarButtonItems?.index(of:xxxButton)!)!)
-
Показать
xxxButton.customView = nil
или
navigationItem.rightBarButtonItems?.insert(newElement: xxxButton, at:SOME_INDEX)
Надеюсь на помощь.
Ответ 16
Сначала установите заголовок пустым, а после swlwction просто установите снова.
Ответ 17
Вы можете использовать ниже код:
self.navigationItem.rightBarButtonItem?.image = nil
self.navigationItem.rightBarButtonItem?.isEnabled = false