我如何dynamic地隐藏视图中的button?
我想在一个视图中dynamic地隐藏一个button,具体取决于一定的条件。
我试图添加一些代码到视图控制器的-viewWillAppear
方法,使显示实际视图之前隐藏button,但我仍然不知道如何做到这一点。
我通过一个IBOutlet参考了button,但我不确定如何从这里前进。 作为参考,这是一个UIBarButtonItem实例。
如果你想隐藏一个UIBarButtonItem,你实际上必须修改父栏的内容。 如果是UIToolBar,则需要将条形的items数组设置为不包含项目的数组。
NSMutableArray *items = [[myToolbar.items mutableCopy] autorelease]; [items removeObject: myButton]; myToolbar.items = items;
将小节项目设置为零。
例如:
self.navigationItem.leftBarButtonItem = nil;
所以我尝试了Ben的获胜方法,但是最终我发现这对我的目的是错误的 – 尽pipe我确信这取决于你想要做什么。 我试图在某些条件下显示一个导航栏button,然后隐藏它,只要条件不再满足(在我的情况下,这是一个“完成”button用于隐藏与UITextView相关联的键盘,它应该只是当用户在文本视图中键入时显示)。 我的步骤如下:
-
我在我的UIViewController类中添加了一个UIBarButtonItem属性。 我在initWithNibName方法中实例化它。
-
当用户开始在文本视图中input时,我将UIBarButtonItem属性指定为导航栏中的rightBarButtonItem。
-
当用户input完毕后,我将UIBarButtonItem属性设置为nil。
它像一个魅力工作。 我在下面添加一些代码示例。
首先在我的视图控制器init方法中实例化button:
barButtonItemDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
然后,在用户开始编辑文本视图时,立即在调用的委托方法中将其设置为正确的栏button:
self.navigationItem.rightBarButtonItem=[self barButtonItemDone];
最后,当button本身被点击时,称为“done”的方法被调用,并且我只在右边的方法中设置rightBarButtonItem为零:
self.navigationItem.rightBarButtonItem=nil;
如果所有那个想要隐藏的是导航栏中的后退button,则有一个更简单的方法:
self.navigationItem.hidesBackButton = YES;
从开发者文档引用:
hidesBackButton
一个布尔值,确定后退button是否隐藏。
@属性(非primefaces,分配)BOOL hidesBackButton
讨论
如果此导航项是顶部项目时后退button被隐藏,则为YES; 否则,否。 默认值是NO。
可用性
在iPhone OS 2.0及更高版本中可用。
这是一个黑客,但它适用于我的情况(并妥善处理dynamic间距):
隐藏:
myButton.width = 0.1;
以显示:
myButton.width = 0.0;
0.0的宽度是“自动宽度”,宽度为0.1,button完全消失(即使我没有在视网膜显示器上试过这个button,甚至没有button的“条子”)。
另一个黑客解决scheme:
myButton.customView = [[UIView alloc] init];
最好的解决scheme是技术性较差。 所有你需要做的是创build你的正常导航栏(顶部)或工具栏(底部),但没有可选的button。 然后创build另一个相同的,但较短的酒吧,然后你放在你想要的部分选项button,并创build您的selectbutton,在这第二个较短的酒吧。
现在,您可以在整个附加栏中调用hidden = YES
。
酒吧无缝重叠,你的里程可能会有所不同。
这个答案是关于基于文本的UIBarButtonItems,但是,相同的概念也可以应用于其他types的button。 请注意,这将允许人们再次隐藏和显示该项目。 上面的许多答案(例如,将button的值设置为零,如果需要的话,不允许重新显示button)。
TL; DR:
if (shouldShowMyBarButtonItem) { self.myBarButtonItem.title = nil; self.myBarButtonItem.action = nil; } else if (!shouldShowMyBarButtonItem) { self.myBarButtonItem.title = @"Title"; self.myBarButtonItem.action = @selector(mySelector:); }
长版:
我试图隐藏的UIBarButtonItem在UIToolbar中,而不是UINavigationBar,因此所有访问导航项左侧(或右侧)barButtonItem属性的build议都不适用于我。 另外,如上所述,当情况改变时,我希望重新显示button。
迈克尔的build议最接近工作,但是,至less在iOS 7中,显示的button仍然有很小的一点可以打开。 在我的应用程序中,当它不应该是可用的时候点击该项目是不可接受的。 上面的代码都隐藏起来,关键是停用button。
我使用私有刷新方法调用上面的代码,这是在用户事件发生时调用的。
这是我做的不是导航栏的一部分的button项目(其中Blank.png是我创build的空白图像,它与它replace的图像大小相同):
theButton.enabled = NO; theButton.image = [UIImage imageNamed: @"Blank.png"];
Ben的答案在技术上是正确的,但是当我在我的自定义UIToolbar上尝试时,项目以我不喜欢的方式进行空间分离,因为我使用的是UIBarButtonSystemItemFlexibleSpace项目。
如果你想让你的其他物品呆在同一个地方,你必须把你的灵活空间设置为固定的空间,或者尝试我所做的:
[filterBarButton.customView setHidden:YES];
注意:这只适用于你的UIBarButtonItem使用自定义视图。
如果您将UIButton
添加到UIBarButtonItem
而不是仅使用UIBarButtonItem
。
然后,您可以将UIButton.hidden
分配给TRUE
或YES
并且它(和UIBarButtonItem
)将不可见或不活动。
希望有所帮助。
只需将button的隐藏属性设置为true:
myButton.hidden = YES;