【问题标题】:Bar Button Item in only one of the tab bar controller navigation barBar Button Item 仅在一个标签栏控制器导航栏中
【发布时间】:2012-07-22 05:15:55
【问题描述】:

我有一个带有 4 个视图控制器的标签栏控制器,并且在导航控制器中有这个标签栏控制器。

我只想为标签栏控制器的一个特定视图控制器显示 UIBarButtonItem。

我尝试使用以下

if (tabBarController.selectedViewController == customTourViewController)
    {
        [tabBarController.navigationItem setRightBarButtonItem:done];
    }

但是按钮没有显示出来。

如果我将每个视图控制器都放在一个导航控制器中,那么按钮只会针对该视图显示,但我最终会有 2 个导航栏。

有什么方法可以实现第一个解决方案吗? 谢谢。

【问题讨论】:

    标签: ios uitabbarcontroller uibarbuttonitem


    【解决方案1】:

    在各个选项卡的各个视图控制器中,我在需要按钮的视图控制器中有以下内容:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    
        UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                        style:UIBarButtonSystemItemDone target:nil action:nil];
        self.tabBarController.navigationItem.rightBarButtonItem = rightButton;
    }
    

    在不需要按钮的视图控制器中,我有:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    
        self.tabBarController.navigationItem.rightBarButtonItem = nil;
    }
    

    所以,如果它不适合您,我不确定它是否是您对 tabBarController 的引用而没有 self 指定(如果我省略了 self,我会收到编译器错误)。这段代码在哪里,因为如果它在您的 tabBarController 子类中,那么您想要self.navigationItem.rightBarButtonItem,对吧?您是否为该变量名定义了自己的 ivar?或者您确定done 定义正确(即不是nil)?或者您确定是否调用了这段代码(也许设置一个断点或插入一个NSLog 并确保到达这段代码)?

    【讨论】:

    • 拯救了一天,伙计!干杯!
    【解决方案2】:

    或者,您可以在需要按钮的同一视图中实现 viewWillDisappear。

    -(void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];        
        self.tabBarController.navigationItem.rightBarButtonItem = nil;
    }
    

    【讨论】:

      【解决方案3】:

      上面接受的答案正是我所需要的,只是想将其转换为 Swift 以供将来使用。

      我已将以下代码添加到需要条形按钮的视图控制器中(我为此示例创建了一个添加按钮):

      override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(animated)
      
      self.tabBarController?.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: nil)
      }
      

      在不需要此条形按钮的视图控制器中,只需在下面添加代码

      override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(animated)
      
      self.tabBarController?.navigationItem.rightBarButtonItem = nil
      }
      

      您使用 viewWillAppearviewDidAppear 是因为您希望每次用户转到指定的视图控制器时都出现条形按钮。

      简单地说,viewDidAppear 在运行时被调用一次,viewWillAppear 会在每次访问视图控制器时被调用。

      【讨论】:

        猜你喜欢
        • 2015-05-25
        • 2019-03-31
        • 2019-10-03
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多