【问题标题】:Removing right bar button item from navigation item从导航项中删除右栏按钮项
【发布时间】:2011-05-23 22:28:18
【问题描述】:

我在导航项中添加了一个右栏按钮项,并希望在某些情况下将其删除。这就是我正在做的事情:

self.navigationItem.rightBarButtonItem = nil;

但没有得到想要的行为。

我想隐藏它,但没有找到任何方法。

【问题讨论】:

  • 那会是什么条件?您确定这是实现所需行为的最佳方式吗?
  • “没有得到想要的行为”——你得到了什么行为?
  • self.navigationItem.setRightBarButtonItem(nil, animated: false) 这对我有用。

标签: iphone objective-c cocoa-touch uibarbuttonitem


【解决方案1】:

你正在做的应该工作。我已经做过很多次了。您确定要从正确的导航项中删除按钮吗? self是当前显示的UIViewController吗?

【讨论】:

  • 我什至引用了属性中保存的 UIBarButton 项,并且将属性设置为 nil 不起作用。必须这样做。
  • 如果您有多个左侧项目(在我的情况下是一个透明间隔和一个项目),navigationItem.leftBarButtonItems = nil 将起作用
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我知道三种方法: (假设在右侧)

    1. 如果您有多个条形按钮:
      self.navigationItem.rightBarButtonItems = nil

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

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

    【讨论】:

    • 我尝试在 Objective C 中将 rightBarButtonItem 分配给 nil 它对我不起作用
    【解决方案4】:

    我通过创建一个新的 rightBarButtonItem 解决了这个问题。

    创建属性:

    @property (nonatomic, strong) UIBarButtonItem *clearRightButtonItem;
    

    合成:

    @synthesize clearRightButtonItem = _clearRightButtonItem;
    

    创建吸气剂:

    - (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;
    

    【讨论】:

      【解决方案5】:

      我的回答与这个问题无关,但由于这是谷歌上的最高结果,因此我将贡献我对这个问题的经验

      我为 rightBarButtonItem 使用了一组项目,因此以某种方式使用了

          self.navigationItem.rightBarButtonItem = nil;
      

      不适合我,所以我制作了一个空的 barbutton 项目并将其设置为 rightBarButtonItem 使用

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

      现在它不见了。

      【讨论】:

        【解决方案6】:

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

        我认为我的右栏按钮不会消失,因为我在 viewWillAppear 函数中调用了它,并且在该函数中,self 不引用当前的 UIViewController

        这对我有用,我没有在viewWillAppear 中设置按钮,而是在previous 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];
            }
        }
        

        【讨论】:

          【解决方案7】:

          在将导航栏添加到实际上未嵌入导航控制器的视图控制器时,我遇到了这个问题。在这种情况下, self.navigationItem 不是保持栏按钮的正确对象。我发现的工作(尽管您可能应该只是将视图控制器嵌入导航控制器中)是为您在 Interface Builder 中添加的导航栏创建一个属性并正常链接它。在这种情况下,我将其命名为“navBar”。

          然后你必须获取导航栏的导航项而不是视图的导航项。在这种情况下,这段代码似乎可以工作:

          UINavigationItem *item = [self.navBar.items objectAtIndex:0];
          item.rightBarButtonItem = nil;
          

          【讨论】:

            【解决方案8】:

            以下代码对我有用:

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

            【讨论】:

              【解决方案9】:

              斯威夫特 3/4:

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

              【讨论】:

                【解决方案10】:

                对于其他人: 我也试过了

                self.navigationItem.rightBarButtonItem = nil;
                

                它没有工作, 然后我注意到我没有从 ma​​in 线程调用它。

                【讨论】: