我如何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相关联的键盘,它应该只是当用户在文本视图中键入时显示)。 我的步骤如下:

  1. 我在我的UIViewController类中添加了一个UIBarButtonItem属性。 我在initWithNibName方法中实例化它。

  2. 当用户开始在文本视图中input时,我将UIBarButtonItem属性指定为导航栏中的rightBarButtonItem。

  3. 当用户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分配给TRUEYES并且它(和UIBarButtonItem )将不可见或不活动。

希望有所帮助。

只需将button的隐藏属性设置为true:

 myButton.hidden = YES;