如何隐藏/显示导航栏中的右键

问题描述 投票:37回答:17

我需要在导航栏中隐藏右键,然后在用户选择一些选项后取消隐藏它。

不幸的是,以下不起作用:

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

有办法吗?

ios objective-c uibarbuttonitem rightbarbuttonitem
17个回答
73
投票

通过将引用设置为nil来隐藏按钮,但是如果您想稍后恢复它,则需要挂起它的副本以便重新分配它。

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
投票

斯威夫特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
投票

在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()显示按钮。

问候!


1
投票

如果右侧只有一个条形按钮项,则可以使用此项,

self.navigationItem.rightBarButtonItem = nil;

假设您在右侧有多个条形按钮,例如假设您在导航项目的右侧有两个条形按钮项目(搜索按钮和过滤器按钮)。现在正确的栏按钮项目是

self.navigationItem.rightBarButtonItems = [searchItem,filterItem]

而且你必须只隐藏搜索按钮,你可以使用像,

self.navigationItem.rightBarButtonItems = [filterItem]

现在发生了什么,您可以完全隐藏导航项中的搜索按钮,并且过滤器项代替搜索项


0
投票

节目:

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

隐藏:

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

0
投票
  1. 假设您可以将特定的条形按钮引用为变量xxxButton

(请打开助理编辑器,Control +拖动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)

希望有帮助。


0
投票

隐藏:

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

0
投票

首先将标题设置为空,然后再次设置swlwction。


0
投票

您可以使用以下代码:

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

0
投票

对于swift 5来隐藏rightBarButtonItem

self.navigationItem.rightBarButtonItem?.customView?.isHidden = true

12
投票

对于Swift 3

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

9
投票

设置参考nil:

current_controller_in_navcontroller.navigationItem.rightBarButtonItem =  nil;

另外一定要在navController当前显示的控制器中调用它,而不是navController本身。


8
投票

节目:

[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为Storyboards&ARC更新的解决方案。请记住,默认情况下,IBOutlets是__weak,因此您需要将其更改为strong,以免过早发布。

@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
投票

信用证必须转到learner这个答案,答案来自这个问题:

hide and show left navigation bar button on demand in 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....,没有任何工作,直到我找到这个。


4
投票

SWIFT 2.2

在swift 2.2中,self.navigationItem不起作用。而是创建NavigationItem的出口(我在“nav”下面命名)并使用它。

此外,以下建议对我使用Xcode 7.3和swift 2.2不起作用

 nav.leftBarButtonItem?.customView?.hidden = true

所以我在上面使用@Matt J的想法如下(我左边有两个项目):

  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 }

3
投票

节目:

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

隐藏:

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

2
投票

我的解决方案

self.navigationItem.rightBarButtonItem.customView.hidden=NO;
© www.soinside.com 2019 - 2024. All rights reserved.