显示/隐藏位于UIToolbar中间的UIBarButtonItem

时间:2012-03-06 16:32:53

标签: ios cocoa-touch uibarbuttonitem uitoolbar

我在StackOverflow上读过几个关于这个主题的类似问题,但它们都不适用于我的案例。

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

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

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

后续

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

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

这看起来效率很低。

5 个答案:

答案 0 :(得分:5)

查看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];

看看它是否与您正在寻找的方式相同

答案 1 :(得分:4)

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

- (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使用,并且可以轻松引用它们来重建工具栏。

答案 2 :(得分:0)

您需要重置工具栏项,在没有要隐藏的按钮的情况下传入新数组。有关详细信息,请参阅Hide UIToolbar UIBarButtonItems

答案 3 :(得分:0)

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

我用不同的方法完成了它。以下是实现它的片段。

步骤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并分配点击事件。

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

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

希望有所帮助!!

答案 4 :(得分:0)

通过对工具栏项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的引用。