从导航项中移除右侧按钮项目

32

我已经在导航条上添加了一个右侧按钮项目,并希望在某些条件下将其删除。这是我的做法:

self.navigationItem.rightBarButtonItem = nil;

但是没有得到期望的行为。

我想要隐藏它,但找不到任何方法。


那会是什么条件呢?你确定这是实现你所期望的行为的最佳方式吗? - Julian
“not getting the desired behavior” - 你得到了什么行为? - Rayfleck
self.navigationItem.setRightBarButtonItem(nil, animated: false) 这对我起作用了。 - Karan Pal
10个回答

21

你正在做的应该可以工作。我已经多次这样做了。你确定你正在从正确的导航项中移除按钮吗?self 是当前显示的 UIViewController吗?


我甚至有我的UIBarButton项目的引用保存在属性中,将该属性设置为nil并没有起作用。必须像这样做。 - abc123
1
如果您有多个左侧项目(在我的情况下是一个透明的间隔符和一个项目),则 navigationItem.leftBarButtonItems = nil 将起作用。 - vokilam

11

Swift 5/4/3 - 我在导航栏的左右两侧有几个按钮,所以我用以下代码将它们隐藏:

func hideNavItems() {
  navigationItem.setLeftBarButtonItems(nil, animated: true)
  navigationItem.setRightBarButtonItems(nil, animated: true)
}

在我的情况下,我实际上需要在以后的某个时间点再次显示这些按钮,因此我将它们存储在一个数组中:

var leftNavItems: [UIBarButtonItem]!
var rightNavItems: [UIBarButtonItem]!

然后我只需调用一个函数来展示(重新添加)它们:

func showNavItems() {
  navigationItem.setLeftBarButtonItems(leftNavItems, animated: true)
  navigationItem.setRightBarButtonItems(rightNavItems, animated: true)
}

你可以跟随这个答案。它有效。在导航栏中不能直接进行隐藏和显示。所以采用这种方法。 - Bilal Khan

9
我知道三种方法: (假设在右侧)
  1. 如果您有多个bar按钮:
    self.navigationItem.rightBarButtonItems = nil

  2. 否则,如果您只有一个bar按钮
    self.navigationItem.rightBarButtonItem = nil

  3. 设置一个空按钮:
    self.navigationItem.setRightBarButtonItem(nil, animated: false)


我尝试在Objective C中将rightBarButtonItem分配为nil,但对我无效。 - Durai Amuthan.H

2
我通过创建一个新的rightBarButtonItem来解决了这个问题。
创建属性:
@property (nonatomic, strong) UIBarButtonItem *clearRightButtonItem;

合成:

@synthesize clearRightButtonItem = _clearRightButtonItem;

创建 getter:
- (UIBarButtonItem *) clearRightButtonItem {
    if (_clearRightButtonItem == nil) {
        UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 38, 38)];
        [rightButton setImage:nil forState:UIControlStateNormal];
        _clearRightButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightButton];
    }
    return _clearRightButtonItem;
}

然后使用新的clearRightButtonItem设置rightBarButtonItem:

self.rightButtonItem = self.clearRightButtonItem;

1

最近我遇到了同样的问题,但我解决了它(感谢Erik B.,你的答案启发了我!不幸的是,我不能投票支持你的答案)

我觉得我的右侧栏按钮不能消失是因为我在viewWillAppear函数中调用了它,在这个函数中,self并没有指向当前的UIViewController

这对我有用,而不是在viewWillAppear中设置按钮,我在前一个UIViewControllernavigationController:willShowViewController:animated:函数中设置它。

例如,我从FirstViewController调用SecondViewController,我想在SecondViewController中隐藏右侧栏按钮,在FirstViewController.m中加入以下内容:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if ([viewController isKindOfClass:[SecondViewController class]]) {
        [viewController.navigationItem setRightBarButtonItem:nil];
    }
}

1

我不是特别针对这个问题回答,但由于这是谷歌搜索的顶部结果,因此我将分享我解决这个问题的经验。

我曾经使用过一个包含多个项的数组作为rightBarButtonItem,因此在某种情况下使用了

    self.navigationItem.rightBarButtonItem = nil;

原本不起作用,所以我创建了一个空的barbutton项,并使用该方法将其设置为rightBarButtonItem

    [self.navigationItem setRightBarButtonItems:@[self.clearRightButtonItem]];

而现在它已经消失了。

0

对于其他人: 我也尝试过

self.navigationItem.rightBarButtonItem = nil;

它没有起作用, 然后我注意到我没有从线程调用它。


0

Swift 3/4:

if let nav = self.navigationController {
   nav.navigationItem.setRightBarButtonItems(nil, animated: true)
   nav.navigationBar.topItem?.rightBarButtonItems = []
}

0

以下代码对我有效:

self.navigationItem?.rightBarButtonItem = nil
navigationBar.items = [self.navigationItem!]

0
我曾经在将导航栏添加到未实际嵌入导航控制器的视图控制器时遇到问题。在这种情况下,self.navigationItem 不是正确的对象来保存你的状态栏按钮。我发现的解决方法是(虽然你可能只需要将 viewcontroller 嵌入导航控制器中),创建一个导航栏属性并像往常一样链接它。在这种情况下,我将其命名为“navBar”。
然后,你必须获取 navBar 的 navigation item 而不是视图的 navigation item。在这种情况下,以下代码似乎有效:
UINavigationItem *item = [self.navBar.items objectAtIndex:0];
item.rightBarButtonItem = nil;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接