我在IB中创建了一个带有几个按钮的工具栏。我想能够隐藏/显示一个按钮取决于数据的状态在主窗口。

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


当前回答

这是一个扩展,将处理这一点。

extension UIBarButtonItem {

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

}

用法:

myBarButtonItem.isHidden = true

其他回答

iOS 8。带有自定义图像的UIBarButtonItem。 我试过很多方法,但大多数都没用。 Max的解决方案,thesetTintColor没有改变为任何颜色。 这是我自己想出来的,我想它会对别人有用。

隐藏:

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

显示:

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

可以在不改变其宽度或将其从工具条中移除的情况下将按钮隐藏在适当的位置。如果将样式设置为普通,删除标题并禁用按钮,则该按钮将消失。要恢复它,只需反转您的更改。

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

子类UIBarButtonItem。 确保界面构建器中的按钮设置为HidableBarButtonItem。 创建一个从按钮到视图控制器的outlet。在视图控制器中,你可以通过调用setHidden来隐藏/显示按钮:

HidableBarButtonItem。h

#import <UIKit/UIKit.h>

@interface HidableBarButtonItem : UIBarButtonItem

@property (nonatomic) BOOL hidden;

@end

公元HidableBarButtonItem。

#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

当栏按钮项被禁用时,将文本颜色设置为透明颜色可能是一个更干净的选项。你不需要在评论中解释什么奇怪的事情。此外,您不会破坏按钮,因此您仍然保留任何相关的故事板segue。

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

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

self.navigationItem.rightBarButton.enabled = NO;

虽然没有隐藏属性,但结果是一样的。

你可以使用文本属性隐藏工具栏按钮:

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

也看到我的解决方案与UIBarButtonItem扩展类似的问题:使UIBarButtonItem消失使用快速IOS