如何显示/隐藏UIBarButtonItem?

Sas*_*sha 247 uitoolbar uibarbuttonitem ios

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

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

lna*_*ger 257

将您的按钮保存在一个强大的插座中(让我们称之为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];
}
Run Code Online (Sandbox Code Playgroud)

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

  • 为了使我的工作在导航控制器中的右按钮,我使用self.navigationItem.rightBarButtonItems和[self.navigationItem setRightBarButtonItems <prams>]而不是toolBarItems和setToolBarItems. (72认同)
  • 或者Apple可能只是添加.hidden属性.-_- (44认同)

Max*_*Max 211

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

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

  • 使用SetTitleTextAttributes: -这部作品栏按钮的项目,如"做"大,"保存"等.然而,它并不像添加项,回收站符号等(对我来说ATLEAST不)工作,因为他们不是文本.
  • 使用TintColor: - 如果我有一个名为"deleteButton"的栏按钮项: -

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

[self.deleteButton setEnabled:NO]; 
[self.deleteButton setTintColor: [UIColor clearColor]];
Run Code Online (Sandbox Code Playgroud)

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

[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
Run Code Online (Sandbox Code Playgroud)

  • 对于Swift:`deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()来禁用和隐藏,而deleteButton.enabled = true; deleteButton.tintColor = nil`重新启用并正常显示。 (3认同)

Dre*_*erg 68

这是一个简单的方法:

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

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

  • 它似乎不适用于导航控制器工具栏,但它适用于其他工具栏. (19认同)
  • 在所有解决方案中,这个解决方案快速,肮脏且有效.我还添加了barbuttItem.enabled = NO; 因为如果我足够打它,我仍然可以按下按钮. (13认同)
  • 似乎不适用于ios 8 xcode 6.3 (5认同)
  • 似乎不适用于ios 9 xcode 7.3.1 (5认同)
  • 它隐藏了它,但它仍然响应水龙头.对我来说,它就像一个隐形按钮. (3认同)

Eli*_*rke 60

可以在不改变宽度或将其从条形图中移除的情况下隐藏按钮.如果将样式设置为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 将buttonItem.title设置为nil在iOS7中对我不起作用.设置回来时按钮没有重新出现.然而,做了什么工作是设置buttonItem.title = @""; (3认同)
  • 这对我来说只需设置btn.title = nil即可.我也设置启用=否,以防万一... (2认同)

vis*_*kar 42

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

navBar.topItem.rightBarButtonItem = nil;
Run Code Online (Sandbox Code Playgroud)

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

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


pab*_*ros 26

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

self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear
Run Code Online (Sandbox Code Playgroud)

并显示UIBarButtonItem:

self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue
Run Code Online (Sandbox Code Playgroud)

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

  • 但这仍然会占用此按钮的空间。 (3认同)

Olc*_*taş 22

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


Den*_*Den 14

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

@IBOutlet weak var addBarButton: UIBarButtonItem!

addBarButton.enabled = false
addBarButton.tintColor = UIColor.clearColor()
Run Code Online (Sandbox Code Playgroud)

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

斯威夫特3,而不是enable使用isEnable属性.


Dmi*_*yuk 12

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


小智 12

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

隐藏:

[self.navigationItem.rightBarButtonItem setEnabled:NO];
[self.navigationItem.rightBarButtonItem setImage:nil];
Run Code Online (Sandbox Code Playgroud)

用于显示:

[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];
Run Code Online (Sandbox Code Playgroud)


Jef*_*Neo 9

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

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

if WANT_TO_SHOW {
    myBarButtonItem.enabled = true
    myBarButtonItem.title = "BUTTON_NAME"
}else{
    myBarButtonItem.enabled = false
    myBarButtonItem.title = ""
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*zyk 6

@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {

    var isHidden: Bool = false {

        didSet {

            isEnabled = !isHidden
            tintColor = isHidden ? UIColor.clear : UIColor.black
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

而现在只需改变isHidden财产.


Eva*_*ood 6

我发现了另一种皱纹tintColorisEnabled办法由Max和其他建议-当VoiceOver会为辅助功能启用,并且按钮逻辑隐藏,无障碍光标仍然将重点放在栏按钮,并指出它是"灰色"(即,因为isEnabled是设为false).接受的答案中的方法不会受到这种副作用的影响,但我发现的另一项工作是isAccessibilityElement在"隐藏"按钮时设置为false:

deleteButton.tintColor = UIColor.clear
deleteButton.isEnabled = false
deleteButton.isAccessibilityElement = false
Run Code Online (Sandbox Code Playgroud)

然后isAccessibilityElement在"显示"按钮时返回true:

deleteButton.tintColor = UIColor.blue
deleteButton.isEnabled = true
deleteButton.isAccessibilityElement = true
Run Code Online (Sandbox Code Playgroud)

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


uma*_*nta 5

从@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];
    }
}
Run Code Online (Sandbox Code Playgroud)

需要时使用以下功能..

[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];
Run Code Online (Sandbox Code Playgroud)


jef*_*yan 5

只需设置 barButton.customView = UIView()并查看技巧


Har*_*ris 5

这是一个可以处理此问题的扩展程序。

extension UIBarButtonItem {

    var isHidden: Bool {
        get {
            return tintColor == .clear
        }
        set {
            tintColor = newValue ? .clear : .white //or whatever color you want
            isEnabled = !newValue
            isAccessibilityElement = !newValue
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

myBarButtonItem.isHidden = true
Run Code Online (Sandbox Code Playgroud)