我在IB中创建了一个带有几个按钮的工具栏。我想能够隐藏/显示一个按钮取决于数据的状态在主窗口。
UIBarButtonItem没有隐藏属性,到目前为止我发现的任何隐藏它们的例子都涉及将导航栏按钮设置为nil,我不认为我想在这里做,因为我可能需要再次显示按钮(更不用说,如果我连接我的按钮到IBOutlet,如果我设置为nil,我不确定我如何得到它)。
我在IB中创建了一个带有几个按钮的工具栏。我想能够隐藏/显示一个按钮取决于数据的状态在主窗口。
UIBarButtonItem没有隐藏属性,到目前为止我发现的任何隐藏它们的例子都涉及将导航栏按钮设置为nil,我不认为我想在这里做,因为我可能需要再次显示按钮(更不用说,如果我连接我的按钮到IBOutlet,如果我设置为nil,我不确定我如何得到它)。
当前回答
我有一个问题,我有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
我希望它能帮助到有类似问题的人。
其他回答
对于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使用的原始颜色
为了隐藏许多项目之一,我使用以下代码:
self.navigationItem.leftBarButtonItems?.remove(at: 0)
self.navigationItem.rightBarButtonItems?.remove(at: 1)
我想如果需要的话可以重新添加。
下面是我的解决方案,虽然我正在寻找它的导航栏。
navBar.topItem.rightBarButtonItem = nil;
这里“navBar”是XIB视图中NavigationBar的IBOutlet 在这里,我想隐藏按钮或根据某些条件显示它。所以我在“如果”测试条件,如果是真的,我将按钮设置为nil在viewDidLoad方法的目标视图。
这可能与你的问题不相关,但如果你想隐藏导航栏上的按钮,情况类似
我在Max和其他人建议的tintColor和isEnabled方法中发现了另一个问题——当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
在我的例子中,栏按钮项仍然占据空间不是问题,因为我们隐藏/显示了右栏按钮项的最左侧。
这是一个很长的答案列表,但为了防止有人想要一个简单的复制和粘贴的快速解决方案,这里是
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);
}
}