如何显示/隐藏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适用于我:
- 为
UINavigationItem
和UIBarButtonItem
创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