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

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


当前回答

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

其他回答

我有一个问题,我有2 leftBarButtonItems。在Mac Catalyst上,firstButton指向一个不支持的操作:用AVFoundation录制视频。Mac Catalyst上只有第二个按钮有效:使用UIImagePickerController。

所以在Mac Catalyst上,我必须将第一个UIBarButtonItem指向secondButton,并始终隐藏第二个UIBarButtonItem。在iOS上,两个按钮都应该显示出来。这就是我的解决方案:

#if TARGET_OS_MACCATALYST
        self.navigationItem.leftBarButtonItem = self.secondButton;
        NSUInteger count = [self.navigationItem.leftBarButtonItems count];
        for (NSUInteger i = 0; i < count; i++) {
            UIBarButtonItem *thisButton = [self.navigationItem.leftBarButtonItems objectAtIndex:i];
            if (i == 1) {
                thisButton.enabled = NO;
                thisButton.tintColor = [UIColor clearColor];
            }
        }
#else
        self.navigationItem.leftBarButtonItem = self.firstButton;
#endif

我希望它能帮助到有类似问题的人。

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

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

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

self.navigationItem.rightBarButton.enabled = NO;

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

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

最后,在iOS 16+中,UIBarButtonItem有isHidden属性。

所以,扩展现有的答案,比如

extension UIBarButtonItem {
    func show() {
        if #available(iOS 16.0, *) {
            isHidden = false
        } else {
            isEnabled = true
            tintColor = .white
        }
    }
    
    func hide() {
        if #available(iOS 16.0, *) {
            isHidden = true
        } else {
            isEnabled = false
            tintColor = .clear
        }
    }
}

我认为我将根据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];
    }
}