我在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按钮时我必须重新创建此列表,那就是我要做的。
这看起来效率很低。
答案 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的引用。