提问



我在IB中用几个按钮创建了一个工具栏。我希望能够隐藏/显示其中一个按钮,具体取决于主窗口中的数据状态。


UIBarButtonItem没有隐藏的属性,到目前为止我发现的隐藏它们的任何例子都涉及将导航栏按钮设置为nil,我不认为我想在这里做,因为我可能需要显示再次按下按钮(更不用说,如果我将我的按钮连接到IBOutlet,如果我将其设置为nil我我不确定如何将其取回)。

最佳参考


将您的按钮保存在强大的插座中(让我们称之为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];
}


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

其它参考1


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


在iOS 7中,要隐藏栏按钮项,我们可以使用以下两种技术: -



  • 使用SetTitleTextAttributes: - 这适用于完成,保存等条形按钮项目。但是,它不适用于添加,垃圾符号等项目(至少不适合我)它们不是文本。

  • 使用TintColor: - 如果我有一个名为deleteButton的条形按钮项目: -



为了隐藏按钮,我使用了以下代码: -


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


为了再次显示该按钮,我使用了以下代码: -


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

其它参考2


这是一个简单的方法:


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


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

其它参考3


可以隐藏按钮到位而不改变其宽度或将其从条中移除。如果将样式设置为plain,删除标题,并禁用该按钮,它将消失。要恢复它,只需撤消您的更改。


-(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;
    }
}

其它参考4


下面是我的解决方案,虽然我正在寻找导航栏。


navBar.topItem.rightBarButtonItem = nil;


这里navBar是XIB视图中NavigationBar的IBOutlet
在这里,我想隐藏按钮或根据某些条件显示它。所以我在If中测试条件,如果为true,我在目标视图的viewDidLoad方法中将按钮设置为nil。


这可能与您的问题无关,但如果您想隐藏NavigationBar上的按钮,则会出现类似情况

其它参考5


我目前正在运行针对iOS 7.1的OS X Yosemite Developer Preview 7和Xcode 6 beta 6,以下解决方案对我来说很好:



  • UINavigationItemUIBarButtonItem s
  • 创建出口
  • 运行以下代码以删除


    [self.navItem setRightBarButtonItem:nil];
    [self.navItem setLeftBarButtonItem:nil];
    

  • 运行以下代码以再次添加按钮


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


其它参考6


对于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的原点颜色

其它参考7


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


@IBOutlet weak var addBarButton: UIBarButtonItem!

addBarButton.enabled = false
addBarButton.tintColor = UIColor.clearColor()


当你需要再次显示此栏时,只需设置反转属性即可。


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

其它参考8


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


隐藏:


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


用于显示:


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

其它参考9


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

其它参考10


试试 Swift ,不要更新tintColor如果你的UIBarButtonItem有一些像AppDelegate中的字体大小的设计,它会在你出现时完全改变按钮的外观。


如果是文本按钮,更改标题可以让您的按钮消失。


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

其它参考11


@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

            isEnabled = !isHidden
            tintColor = isHidden ? UIColor.clear : UIColor.black
        }
    }
}


现在只需更改isHidden属性。

其它参考12


无法隐藏UIBarButtonItem,您必须将其从superView中删除,并在想要再次显示时将其添加回来。

其它参考13


从@lnafziger回答改进


将您的Barbutton保存在强力出口中并执行此操作以隐藏/显示它:


-(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];
    }
}


需要时使用以下功能..


[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];

其它参考14


这在答案列表中已经很长了,但是为了防止有人想要快速复制和粘贴快速解决方案,这里是


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);
    }
}

其它参考15


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


例如:


1。有一个UIButton你要隐藏/取消隐藏。


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


UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button

UIBarButtonItem*yourBarButton=[**UIBarButtonItem alloc] initWithCustomView:myButton];


3。您可以隐藏/取消隐藏您创建的myButton[myButton setHidden:YES];

其它参考16


我在Max和其他人建议的tintColorisEnabled方法中发现了另一个问题 - 当VoiceOver启用了辅助功能并且按钮逻辑隐藏时,辅助功能光标仍然会聚焦在条形按钮上,并声明它变暗(即因为isEnabled设置为false)。接受的答案中的方法并没有受到这种副作用的影响,但我发现的另一项工作是在隐藏按钮时将isAccessibilityElement设置为false:


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


然后在显示按钮时将isAccessibilityElement设置为true:


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


由于我们隐藏/显示最左侧的条形按钮项目,因此条形按钮项目仍占用空间不是问题。

其它参考17


禁用条形按钮项时将文本颜色设置为清晰颜色可能是一个更清晰的选项。你必须在评论中解释这一点并不奇怪。你也不要破坏按钮,这样你仍然可以保留任何相关的故事板。


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


然后,当你想要隐藏条形按钮项时,你可以这样做:


self.navigationItem.rightBarButton.enabled = NO;


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

其它参考18


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

其它参考19


一些辅助方法,我认为我根据lnafziger分享了接受的答案,因为我有多个工具栏和多个按钮:


-(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];
    }
}

其它参考20


您可以轻松获取视图并以这种方式隐藏它


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

其它参考21


补充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];
    }
}

其它参考22


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


对于UINavigationBar:


self.navigationItem.rightBarButtonItem = nil

self.navigationItem.leftBarButtonItem = nil

其它参考23


如果您使用的是Swift 3


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

其它参考24


您需要操作toolbar.items数组。


这是我用来隐藏和显示完成按钮的一些代码。如果您的按钮位于工具栏的最边缘或其他按钮之间,则其他按钮将移动,因此如果您希望按钮消失,则将按钮作为最后一个按钮朝向中心。我动画按钮移动效果,我非常喜欢它。


-(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];


}


所以现在可以使用以下代码来显示您的按钮


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


或隐藏你的按钮


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

其它参考25


在IB中,如果你将按钮的标题留空,它将不会显示(从未初始化?)。我在UI更新期间的开发过程中经常这样做,如果我想要一个条形按钮项目临时消失的构建而不删除它并且将其全部删除出口参考。


这在运行时没有相同的效果,将按钮的标题设置为nil不会导致整个按钮消失。抱歉没有真正回答你的问题,但可能对某些人有用。


编辑:此技巧仅在按钮的样式设置为plain时才有效

其它参考26


我将在这里添加我的解决方案,因为我还没有在这里找到它。我有一个动态按钮,其图像取决于一个控件的状态。对我来说最简单的解决方案是如果控件不存在则将图像设置为nil。每次更新控件时图像都会更新,因此这对我来说是最佳选择。只是为了确保我也将enabled设置为NO


将宽度设置为最小值在iOS 7上不起作用。

其它参考27


归功于@lnafziger,@ MindSpiker,@ vishal等。人,


我到达单个右(或左)栏按钮的最简单的一个班轮是:


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


我测试了它,它适用于我(通过IB连接强大的条形按钮项目)。

其它参考28


子类UIBarButtonItem
确保Interface Builder中的按钮设置为HidableBarButtonItem
从按钮到视图控制器的插座。从视图控制器中,您可以通过调用setHidden:隐藏/显示按钮


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

其它参考29


我使用xib和UIToolbar。 BarButtonItem是在xib文件中创建的。我为BarButtonItem创建了IBOutlet。我用这段代码来隐藏我的BarButtonItem


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


这帮助了我。