【问题标题】:Hide BarButton item from Navigation Controller of TabBarController从 TabBarController 的导航控制器中隐藏 BarButton 项
【发布时间】:2014-04-01 10:37:28
【问题描述】:

我有一个包含三个选项卡的 tabBarController。我只想在第一个 ViewController 中将 rightBarButtonItem 显示到导航栏,但是当我回来时,我希望它再次可见。如何做到这一点?

我尝试为 BarButtonItem 设置 enabled=NO 但结果并不好。

我还尝试在视图更改时将 BarButtonItem 设置为 nil,但当我返回时已消失。

我将 BarButtonItem 从 viewDidLoad 移到 viewWillAppear 但它不能正常工作。

这是将 rightBarButtonItem 放入第一个 ViewController 的 viewDidLoad 的代码。

UIImage *refreshButtonImage = [UIImage imageNamed:@"9B_Info.png"];
UIImage *refreshButtonImageB = [UIImage imageNamed:@"9A_Info.png"];

UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom];

[refreshButton setImage:refreshButtonImage
               forState:UIControlStateNormal];

[refreshButton setImage:refreshButtonImageB
               forState:UIControlStateHighlighted];

[refreshButton setImage:refreshButtonImageB
               forState:UIControlStateSelected];

refreshButton.frame = CGRectMake(0, 0, 30, 30);

[refreshButton addTarget:self
                  action:@selector(showImageInfo)
        forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *refreshBarButtonItem = [[UIBarButtonItem alloc]  initWithCustomView:refreshButton];

self.refreshBtn=refreshBarButtonItem;

[self.tabBarController.navigationItem setRightBarButtonItem:self.refreshBtn];

【问题讨论】:

  • 你能上传你的故事板的屏幕截图吗?
  • 我以编程方式添加了 rightBarButtonItem。
  • 对,你能展示一下实现吗?
  • 是的,我正是想要这个。
  • @James03 我用一些代码重新编辑了我的帖子

标签: ios objective-c uinavigationcontroller uitabbarcontroller uibarbuttonitem


【解决方案1】:

您使用情节提要还是全部以编程方式?试试这个:

1- 打开新项目(单视图)

2- 进入故事板 -> 添加导航控制器

3- 删除表视图控制器

4- 将您的导航控制器设置为启动控制器(将您的视图控制器指向的箭头拖动到您的导航控制器)

5- 将您的视图控制器设置为导航控制器的根视图控制器

6- 完成您的代码和@Apurv 的解决方案如下

【讨论】:

  • 感谢您的时间和巡演实施詹姆斯。我没有检查它,但似乎真的很好。我在另一个答案中发布了对我有用的代码。
【解决方案2】:

替换下面的行:

[self.tabBarController.navigationItem setRightBarButtonItem:self.refreshBtn];

用这一行:

[self.navigationItem setRightBarButtonItem:self.refreshBtn];

当你只想为 viewController 显示它时,不要将它添加到 tabBarController。

【讨论】:

  • 这样barButtonItem根本不会出现。
  • 您是否将任何自定义图像设置为 UINavigationBar?
  • 是的@Apurv。我有导航栏的自定义图像
  • 那是因为你没有导航控制器,尝试添加一个并使用这个解决方案
  • 然后先创建一个Navigation Controller。并将其添加到您的选项卡控制器数组中。
【解决方案3】:

如果将来有人想出这个,这对我有用:

在第一个视图控制器中,我将其添加到 viewWillAppear

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];

    NSLog(@"!!!!");

    UIImage *refreshButtonImage = [UIImage imageNamed:@"9B_Info.png"];
    UIImage *refreshButtonImageB = [UIImage imageNamed:@"9A_Info.png"];

    UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom];

    [refreshButton setImage:refreshButtonImage
                forState:UIControlStateNormal];

    [refreshButton setImage:refreshButtonImageB
                forState:UIControlStateHighlighted];

    [refreshButton setImage:refreshButtonImageB
                forState:UIControlStateSelected];

    refreshButton.frame = CGRectMake(0, 0, 30, 30);

    [refreshButton addTarget:self
                   action:@selector(showImageInfo)
         forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *refreshBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:refreshButton];

    self.refreshBtn=refreshBarButtonItem;

    [self.tabBarController.navigationItem setRightBarButtonItem:self.refreshBtn];



}

在 viewWillAppear 方法的第二个视图控制器中:

    self.tabBarController.navigationItem.rightBarButtonItem=nil;

问题是每个 viewController 到 TabBarController 的 viewDidLoad 只被调用一次,但 viewWillAppear 每次出现时都会被调用。

【讨论】:

  • 你不需要使用这个hack,它是处理你的问题的肮脏方式。通过寻找导航控制器+导航栏查看苹果的文档,希望对你有帮助;)
  • 为什么是这个黑客?有些问题需要创造力和幻想,我认为这不是黑客。
  • 另外,如果您观察到我的代码与@Apurv 答案相似,但与 tabController 实现类似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2018-04-19
相关资源
最近更新 更多