如何显示/隐藏UIBarButtonItem?

我用几个button在IB中创build了一个工具栏。 我希望能够根据主窗口中数据的状态来隐藏/显示其中一个button。

UIBarButtonItem没有一个隐藏的属性,我发现到目前为止隐藏它们的任何示例涉及设置导航栏button为零,我不认为我想在这里做,因为我可能需要再次显示button(更何况,如果我把我的button连接到一个IBOutlet,如果我把它设置为零,我不知道我怎么把它拿回来)。

将你的button保存在一个强大的sockets(我们称之为myButton ),然后添加/删除它:

 // Get the reference to the current toolbar buttons NSMutableArray *toolbarButtons = [self.toolbarItems mutableCopy]; // This is how you remove the button from the toolbar and animate it [toolbarButtons removeObject:self.myButton]; [self setToolbarItems:toolbarButtons animated:YES]; // This is how you add the button to the toolbar and animate it if (![toolbarButtons containsObject:self.myButton]) { // The following line adds the object to the end of the array. // If you want to add the button somewhere else, use the `insertObject:atIndex:` // method instead of the `addObject` method. [toolbarButtons addObject:self.myButton]; [self setToolbarItems:toolbarButtons animated:YES]; } 

因为它存储在sockets中,即使它不在工具栏上,也会保留对它的引用。

我知道这个问题的答案迟了。 但是,如果有其他人面临类似的情况,这可能会有所帮助。

在iOS 7中,要隐藏一个栏button项,我们可以使用以下两种技术:

  • 使用SetTitleTextAttributes : – 这个工程很棒,像“完成”,“保存”等栏button项目,但它不适用于像添加,垃圾桶等符号等(至less不是我),因为他们不是文本。
  • 使用TintColor : – 如果我有一个名为“deleteButton”的酒吧button项目: –

要隐藏button,我使用了下面的代码:

 [self.deleteButton setEnabled:NO]; [self.deleteButton setTintColor: [UIColor clearColor]]; 

为了再次显示button,我使用了下面的代码:

 [self.deleteButton setEnabled:YES]; [self.deleteButton setTintColor:nil]; 

这是一个简单的方法:

 hide: barbuttonItem.width = 0.01; show: barbuttonItem.width = 0; //(0 defaults to normal button width, which is the width of the text) 

我只是在视网膜iPad上运行它,而.01足够小,不会显示出来。

可以在不改变宽度的情况下隐藏button,也可以将其从栏中删除。 如果将样式设置为普通,则删除标题,并禁用该button,它将消失。 要恢复它,只需改变你的改变。

 -(void)toggleBarButton:(bool)show { if (show) { btn.style = UIBarButtonItemStyleBordered; btn.enabled = true; btn.title = @"MyTitle"; } else { btn.style = UIBarButtonItemStylePlain; btn.enabled = false; btn.title = nil; } } 

以下是我的解决scheme,虽然我正在寻找导航栏。

 navBar.topItem.rightBarButtonItem = nil; 

这里的“navBar”是XBIB视图中NavigationBar的一个IBOutlet。这里我想隐藏button或者根据某些条件显示它。 所以即时通讯testing的条件,如果“如果”,如果真的我设置button为无目标视图的viewDidLoad方法。

这可能与您的问题完全不相关,但如果您想隐藏NavigationBar上的button,则会出现类似的情况

我目前正在运行OS X优胜美地开发者预览版7和针对iOS 7.1的Xcode 6 beta 6,以下解决scheme适用于我:

  • UINavigationItemUIBarButtonItem创build出口
  • 运行下面的代码来删除

     [self.navItem setRightBarButtonItem:nil]; [self.navItem setLeftBarButtonItem:nil]; 
  • 运行以下代码再次添加button

     [self.navItem setRightBarButtonItem:deleteItem]; [self.navItem setLeftBarButtonItem:addItem]; 

我在我的项目中使用了IBOutlets。 所以我的解决scheme是:

 @IBOutlet weak var addBarButton: UIBarButtonItem! addBarButton.enabled = false addBarButton.tintColor = UIColor.clearColor() 

而当你需要再次显示这个栏,只需设置反转属性。

Swift 3中,而是enable使用isEnable属性。

iOS 8.具有自定义图像的UIBarButtonItem。 尝试了很多不同的方式,其中大多数都没有帮助。 Max的解决scheme, setTintColor并没有改变成任何颜色。 我自己想出了这个,认为这对某个人是有用的。

隐藏:

 [self.navigationItem.rightBarButtonItem setEnabled:NO]; [self.navigationItem.rightBarButtonItem setImage:nil]; 

显示:

 [self.navigationItem.rightBarButtonItem setEnabled:YES]; [self.navigationItem.rightBarButtonItem setImage:image]; 

self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];

尝试在Swift中 ,不要更新tintColor如果你有一些UIBarButtonItem的devise,像AppDelegate中的字体大小,它将完全改变你的button出现时的外观。

在文本button的情况下,更改标题可以让你的button“消失”。

 if WANT_TO_SHOW { myBarButtonItem.enabled = true myBarButtonItem.title = "BUTTON_NAME" }else{ myBarButtonItem.enabled = false myBarButtonItem.title = "" } 

对于Swift 3和Swift 4,你可以这样做来隐藏UIBarButtomItem

 self.deleteButton.isEnabled = false self.deleteButton.tintColor = UIColor.clear 

并显示UIBarButtonItem

 self.deleteButton.isEnabled = true self.deleteButton.tintColor = UIColor.blue 

tintColor你必须指定你用于UIBarButtomItem的原点颜色

没有办法“隐藏”一个UIBarButtonItem,你必须将它从superView中删除,并在你想再次显示时将其添加回来。

改善@lnafziger的答案

将Barbuttons保存在一个强大的sockets中 ,并隐藏/显示它:

 -(void) hideBarButtonItem :(UIBarButtonItem *)myButton { // Get the reference to the current toolbar buttons NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy]; // This is how you remove the button from the toolbar and animate it [navBarBtns removeObject:myButton]; [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES]; } -(void) showBarButtonItem :(UIBarButtonItem *)myButton { // Get the reference to the current toolbar buttons NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy]; // This is how you add the button to the toolbar and animate it if (![navBarBtns containsObject:myButton]) { [navBarBtns addObject:myButton]; [self.navigationItem setRightBarButtonItems:navBarBtns animated:YES]; } } 

当需要使用下面的function..

 [self showBarButtonItem:self.rightBarBtn1]; [self hideBarButtonItem:self.rightBarBtn1]; 
 @IBDesignable class AttributedBarButtonItem: UIBarButtonItem { var isHidden: Bool = false { didSet { isEnabled = !isHidden tintColor = isHidden ? UIColor.clear : UIColor.black } } } 

现在只需改变isHidden属性。

一种方法是在分配UIBarButtonItem时使用initWithCustomView:(UIView *)属性。 UIView子类将有隐藏/取消隐藏属性。

例如:

1.有一个你想隐藏/取消隐藏的UIButton

2.UIButton作为自定义视图。 喜欢 :

 UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton]; 

3.你可以隐藏/取消隐藏你创build的myButton[myButton setHidden:YES];

这是很长的路要走的答案清单,但以防万一有人想要一个简单的复制和粘贴迅捷的解决scheme,这里是

 func hideToolbarItem(button: UIBarButtonItem, withToolbar toolbar: UIToolbar) { var toolbarButtons: [UIBarButtonItem] = toolbar.items! toolbarButtons.removeAtIndex(toolbarButtons.indexOf(button)!) toolbar.setItems(toolbarButtons, animated: true) } func showToolbarItem(button: UIBarButtonItem, inToolbar toolbar: UIToolbar, atIndex index: Int) { var toolbarButtons: [UIBarButtonItem] = toolbar.items! if !toolbarButtons.contains(button) { toolbarButtons.insert(button, atIndex: index) toolbar.setItems(toolbarButtons, animated:true); } } 

当条形图button项被禁用时,将文本颜色设置为一个清晰的颜色可能是一个更清洁的选项。 你不得不在评论中解释一些古怪的东西。 你也不要摧毁button,所以你仍然保持任何相关的故事情节。

 [self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]} forState:UIControlStateDisabled]; 

然后,当你想隐藏酒吧button项目,你可以做:

 self.navigationItem.rightBarButton.enabled = NO; 

这是跛脚没有隐藏的财产,但这提供了相同的结果。

如果UIBarButtonItem有一个图像,而不是其中的文本,你可以这样做来隐藏它: navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;

我以为我会分享基于lnafziger接受的答案的一些帮手方法,因为我有多个工具栏和多个button:

 -(void) hideToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar{ NSMutableArray *toolbarButtons = [toolbar.items mutableCopy]; [toolbarButtons removeObject:button]; [toolbar setItems:toolbarButtons animated:NO]; } -(void) showToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar atIndex:(int) index{ NSMutableArray *toolbarButtons = [toolbar.items mutableCopy]; if (![toolbarButtons containsObject:button]){ [toolbarButtons insertObject:button atIndex:index]; [self setToolbarItems:toolbarButtons animated:YES]; } } 

您可以轻松地获得视图并以这种方式隐藏视图

 let view: UIView = barButtonItem.valueForKey("view") as! UIView view.hidden = true 

补充Eli Burke的回应,如果你的UIBarButtonItem有一个背景图像而不是标题,你可以使用下面的代码:

 -(void)toggleLogoutButton:(bool)show{ if (show) { self.tabButton.style = UIBarButtonItemStyleBordered; self.tabButton.enabled = true; UIImage* imageMap = [UIImage imageNamed:@"btn_img.png"]; [((UIButton *)[self.tabButton customView]) setBackgroundImage:imageMap forState:UIControlStateNormal]; } else { self.tabButton.style = UIBarButtonItemStylePlain; self.tabButton.enabled = false; [((UIButton *)[self.tabButton customView]) setBackgroundImage:nil forState:UIControlStateNormal]; } } 

对于Swift版本,这里是代码:

对于UINavigationBar

 self.navigationItem.rightBarButtonItem = nil self.navigationItem.leftBarButtonItem = nil 

如果你使用的是Swift 3

 if (ShowCondition){ self.navigationItem.rightBarButtonItem = self.addAsset_btn } else { self.navigationItem.rightBarButtonItem = nil } 

你需要操纵toolbar.items数组。

这里是我用来隐藏和显示一个完成button的一些代码。 如果您的button位于工具栏的最边缘,或者位于其他button之间,则其他button将会移动,所以如果您希望button消失,请将button作为最后一个button。 我为button移动效果,我非常喜欢它。

 -(void)initLibraryToolbar { libraryToolbarDocumentManagementEnabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count]; libraryToolbarDocumentManagementDisabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count]; [libraryToolbarDocumentManagementEnabled addObjectsFromArray:self.libraryToolbar.items]; [libraryToolbarDocumentManagementDisabled addObjectsFromArray:self.libraryToolbar.items]; trashCan = [libraryToolbarDocumentManagementDisabled objectAtIndex:3]; mail = [libraryToolbarDocumentManagementDisabled objectAtIndex:5]; [libraryToolbarDocumentManagementDisabled removeObjectAtIndex:1]; trashCan.enabled = NO; mail.enabled = NO; [self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:NO]; 

}

所以现在可以使用下面的代码来显示你的button

 [self.libraryToolbar setItems:libraryToolbarDocumentManagementEnabled animated:YES]; trashCan.enabled = YES; mail.enabled = YES; 

或者隐藏你的button

 [self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES]; trashCan.enabled = NO; mail.enabled = NO; 

在IB中,如果您将button的标题留空,它将不会出现(从未初始化?)。 我经常在UI更新期间的开发过程中这样做,如果我想让一个条形button项目在一个构build中消失而不删除它并且将其所有的出口引用全部删除。

这在运行时不具有相同的效果,将button的标题设置为零不会导致整个button消失。 对不起并不真正回答你的问题,但可能是有用的一些。

编辑:这个技巧只有在button的风格设置为普通时才有效

我会在这里添加我的解决scheme,因为我还没有find它在这里提到。 我有一个dynamic的button,其图像取决于一个控件的状态。 对我来说,最简单的解决scheme是将图像设置nil如果控件不存在。 每次控件更新时,图像都会更新,因此这对我来说是最合适的。 只是为了确定我也将enabled设置为NO

将宽度设置为最小值不适用于iOS 7。

凭借@lnafziger,@MindSpiker,@vishal等。 人,

我到达单个右(或左)栏button的最简单的一行是:

 self.navigationItem.rightBarButtonItem = <#StateExpression#> ? <#StrongPropertyButton#> : nil; 

如:

 @interface MyClass() @property (strong, nonatomic) IBOutlet UIBarButtonItem *<#StrongPropertyButton#>; @end @implementation - (void) updateState { self.navigationItem.rightBarButtonItem = <#StateExpression#> ? <#StrongPropertyButton#> : nil; } @end 

我testing了这个,它适用于我(与强大的酒吧button项通过IB连线)。

子类UIBarButtonItem 。 确保Interface Builder中的button被设置为HidableBarButtonItem 。 从button到视图控制器的sockets。 从视图控制器,你可以通过调用setHidden:隐藏/显示buttonsetHidden:

HidableBarButtonItem.h

 #import <UIKit/UIKit.h> @interface HidableBarButtonItem : UIBarButtonItem @property (nonatomic) BOOL hidden; @end 

HidableBarButtonItem.m

 #import "HidableBarButtonItem.h" @implementation HidableBarButtonItem - (void)setHidden:(BOOL const)hidden { _hidden = hidden; self.enabled = hidden ? YES : NO; self.tintColor = hidden ? [UIApplication sharedApplication].keyWindow.tintColor : [UIColor clearColor]; } @end 

我曾与xib和UIToolbar合作。 BarButtonItem是在xib文件中创build的。 我为BarButtonItem创build了IBOutlet。 我用这个代码来隐藏我的BarButtonItem

  self.myBarButtonItem.enabled = NO; self.myBarButtonItem.title = nil; 

这帮助了我。

您可以使用文本属性来隐藏栏button:

 barButton.enabled = false barButton.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: .Normal) 

也看到我的解决scheme与UIBarButtonItem扩展类似的问题: 使用swift IOS使UIBarButtonItem disapear