【问题标题】:Show/Hiding a UIBarButtonItem, located in the middle of a UIToolbar显示/隐藏位于 UIToolbar 中间的 UIBarButtonItem
【发布时间】:2012-03-24 04:15:04
【问题描述】:

我在 StackOverflow 上阅读了几个关于此主题的类似问题,但没有一个适用于我的案例。

我的应用程序上有一个 UIToolbar。 ToolBar 的布局如下所示。

(Button #1) (Button #2) (Button #3) <--- Flex Controller ---> (Button #4)

显示/隐藏Button #3 UIBarButtonItem 的最有效方法是什么,因为它位于 UIToolbar 的中间?

跟进

我知道setItems:Animated 方法,但这似乎有问题,因为我的所有按钮都通过 IB 连接,并且它们具有关联的 IBAction。

这是否意味着我需要找到一种方法来在隐藏按钮 #3 时保留它(因为我使用的是 ARC?)我正在寻找添加和删除这些按钮的最佳/有效方法对象。如果每次我必须显示/隐藏我的 #3 按钮时都必须重新创建此列表,我将这样做。

看起来效率太低了。

【问题讨论】:

  • 可能您已经尝试过了,但您不能只使用按钮的hidden 属性吗?
  • @Novarg:该属性在 UIBarButtonItem 上不可用,因为它不是从 UIButton 继承的。
  • 将按钮连接为 IBOutlets,然后您可以在调整工具栏的项目时引用它们。我已经给出了一个答案,描述了我在简化问题时使用的方法。

标签: ios cocoa-touch uibarbuttonitem uitoolbar


【解决方案1】:

查看UIToolBar.h,有如下方法:

- (void)setItems:(NSArray *)items animated:(BOOL)animated;   // will fade in or out or reorder and adjust spacing

您应该能够执行以下操作:

NSMutableArray *items = [toolBar.items mutableCopy];
[items removeObjectAtIndex:2];
[toolBar setItems:items animated:YES];

看看这是否符合您的要求

【讨论】:

  • 现在,一旦它应该显示,我将如何添加回已删除的项目?仅供参考,该按钮通过 IB 连接,并具有关联的 IBAction。
  • 您必须将UIBarButtonItem 存储在实例变量中,并通过类似的过程稍后将其重新添加。来自 IB 应该不会影响任何事情。
【解决方案2】:

我建议以下列方式构建一个辅助函数:

- (void) setToolbarItems:(BOOL) button3Shown {
    NSMutableArray *items = [NSMutableArray arrayWithCapacity:5];
    [items addObject:button1];
    [items addObject:button2];
    if(button3Shown) {
        [items addObject:button3];
    }
    [items addObject:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]];
    [items addObject:button4];
    [self.toolbar setItems:[items copy] animated:YES];
}

这样的好处是在您需要更新时随时可用,然后您可以轻松添加/删除按钮。为了使其工作,您需要在实现文件中将按钮作为 IBOutlets 提供,并且可以轻松引用它们来重建工具栏。

【讨论】:

  • 请注意,这是一个很好的解决方案,但是使用initWithCustomView: 方法创建的UIBarButtonItems 也需要设置它们的框架。
【解决方案3】:

您需要重置工具栏项目,传入一个新数组,而无需隐藏您想要隐藏的按钮。有关详细信息,请参阅Hide UIToolbar UIBarButtonItems

【讨论】:

    【解决方案4】:

    在运行时创建不同的 UIBarButtonItems 数组并在 UIToolbar 中添加/删除可能会增加执行的复杂性。

    我使用不同的方法完成了它。这是实现它的sn-ps。

    第 1 步:创建 IBOutlet 或创建 UIToolbar 实例。

        UIToolbar *toolBar = [UIToolbar alloc] init];
    

    根据需要设置所需的样式。

    第 2 步:创建 UIButton 类型实例。

        UIButton *button1, *button2;
    

    第 3 步:为按钮分配图像(如果需要)。

        button1 = [UIButton alloc] initWithFrame:CGRectMake(0.f,0.f,30.f,30.f);
        [button1 setBackgroundImage:[UIImage imageNamed:@"image1.png"] forState:UIControlStateNormal];
    
        button2 = [UIButton alloc] initWithFrame:CGRectMake(0.f,0.f,30.f,30.f);
        [button2 setBackgroundImage:[UIImage imageNamed:@"image2.png"] forState:UIControlStateNormal];
    

    第 4 步:使用上述按钮创建 UIBarButtonItem 实例作为自定义视图。

        UIBarButtonItem *toolbarbuttonItem1 = [UIBarButtonItem alloc] initWithCustomView:button1];
        UIBarButtonItem *toolbarbuttonItem2 = [UIBarButtonItem alloc] initWithCustomView:button1];
    

    第 5 步:将条形按钮项分配给工具栏。

        toolBar.items = [NSArray arrayWithObjects:toolbarbuttonItem1,toolbarbuttonItem2,nil];
    

    第 6 步:将工具栏添加到 VIEW。

    第 7 步:在 VIEW 中创建一个 UIButton IBOutlet 并分配一个点击事件。

    在点击事件中调用以下辅助方法来切换隐藏。

        - (void) toggleToolbarButtons {
               button1.hidden = !button1.hidden;
               button2.hidden = !button2.hidden;
        }
    

    希望有帮助!!

    【讨论】:

      【解决方案5】:

      使用现有对工具栏项目 item1、item2 和 item3 的引用,最直接的方法是删除所有项目,然后按照您想要的顺序重新添加每个项目。这段代码是从 UIToolbar 子类的角度编写的:

      let flexSpace: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
      let fixedSpace: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)
      
      self.items?.removeAll()
      self.items?.append(flexSpace)
      self.items?.append(item1)
      self.items?.append(fixedSpace)
      self.items?.append(item3)
      self.items?.append(fixedSpace)
      self.items?.append(item2)
      

      这些项目引用可以来自 IBOutlets。将这些引用更改为强引用而不是 IB 插入的默认弱引用,以便 UIToolbar 将保留对这些项目的引用,即使它们已被删除,从而保持相关的 IBAction 函数关系。

      要从 UIToolbar 子类中从 UIToolbar 中删除特定项目,而无需重新设置所有项目:

      if let index = self.items?.index(of: buttonToRemove) {
          self.items?.remove(at: index)
      }
      

      如果不在 UIToolbar 子类中,只需将 self 替换为整个 UIToolbar 的引用即可。

      【讨论】:

        猜你喜欢
        • 2016-07-21
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多