Заставьте UIBarButtonItem исчезнуть с помощью быстрой IOS
У меня есть IBOutlet, с которым я связался из раскадровки
@IBOutlet var creeLigueBouton: UIBarButtonItem!
и я хочу, чтобы это исчезло, если условие истинно
if(condition == true)
{
// Make it disappear
}
17 ответов
Вы действительно хотите скрыть / показать creeLigueBouton
? Вместо этого намного проще включить / отключить ваши UIBarButtonItems. Вы сделаете это с помощью нескольких строк:
if(condition == true) {
creeLigueBouton.enabled = false
} else {
creeLigueBouton.enabled = true
}
Этот код можно даже переписать более коротким способом:
creeLigueBouton.enabled = !creeLigueBouton.enabled
Давайте посмотрим на это в подклассе UIViewController:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var creeLigueBouton: UIBarButtonItem!
@IBAction func hide(sender: AnyObject) {
creeLigueBouton.enabled = !creeLigueBouton.enabled
}
}
Если вы действительно хотите показать / скрыть creeLigueBouton
, вы можете использовать следующий код:
import UIKit
class ViewController: UIViewController {
var condition: Bool = true
var creeLigueBouton: UIBarButtonItem! //Don't create an IBOutlet
@IBAction func hide(sender: AnyObject) {
if(condition == true) {
navigationItem.rightBarButtonItems = []
condition = false
} else {
navigationItem.rightBarButtonItems = [creeLigueBouton]
condition = true
}
}
override func viewDidLoad() {
super.viewDidLoad()
creeLigueBouton = UIBarButtonItem(title: "Creer", style: UIBarButtonItemStyle.Plain, target: self, action: "creerButtonMethod")
navigationItem.rightBarButtonItems = [creeLigueBouton]
}
func creerButtonMethod() {
print("Bonjour")
}
}
Использовать свойство включено и tintColor
let barButtonItem:UIBarButtonItem? = nil
if isHidden{
barButtonItem?.enabled = false
barButtonItem?.tintColor = UIColor.clearColor()
}else{
barButtonItem?.enabled = true
barButtonItem?.tintColor = nil
}
// Nice answer haiLong, I think as an extension this is more convenient.
extension UIBarButtonItem {
var isHidden: Bool {
get {
return !isEnabled && tintColor == .clear
}
set {
tintColor = newValue ? .clear : nil
isEnabled = !newValue
}
}
}
РЕДАКТИРОВАТЬ: Удалено принудительное развертывание и фиксированное значение.
Для Swift 3
if (Show_condition) {
self.navigationItem.rightBarButtonItem = self.addAsset_btn
}
else {
self.navigationItem.rightBarButtonItem = nil
}
Первый способ:
Просто установите .title
в ""
Второй способ:
Просто позвони updateToolBar()
whenever you want to show/hide the creeLigueBouton
,
func updateToolBar() {
var barItems: [UIBarButtonItem] = []
if condition != true {
// Make it appear
barItems.append(creeLigueBouton)
}
barItems.append(anotherButton)
myToolBar.setItems(barItems, animated: true)
myToolBar.setNeedsLayout()
}
Следующее решение работает для меня.
var skipButton: UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
skipButton.frame = CGRectMake(10.0, 0.0, 58.0, 32.0);
skipButton.setTitle("Skip", forState: UIControlState.Normal)
skipButton.setTitleColor(UIColor(red: 0.0, green: 122.0/255.0, blue: 255.0/255.0, alpha: 1.0), forState: UIControlState.Normal)
skipButton.addTarget(self, action: "rightButtonAction:", forControlEvents: UIControlEvents.TouchUpInside)
var skipButtonItem = UIBarButtonItem(customView: skipButton)
self.navigationItem.rightBarButtonItem = skipButtonItem;
if hideSkipButton == true {
self.navigationItem.rightBarButtonItem = nil
}
Вот мое решение:
скрывать:
self.creeLigueBouton.title = ""
self.creeLigueBouton.style = UIBarButtonItemStyle.Plain
self.creeLigueBouton.enabled = false
шоу:
self.creeLigueBouton.title = "Original Button Text"
self.creeLigueBouton.style = UIBarButtonItemStyle.Bordered
self.creeLigueBouton.enabled = true
Уже поздно отвечать, но в поисках ответа на мою проблему я нашел эту тему. Отмеченный ответ не помог мне, но мне удалось решить мою проблему благодаря ответу @haiLong. Мое решение работает для всех типов кнопок панели... Я думаю. Добавьте это к вашему ViewController и используйте по мере необходимости.
var tintColorsOfBarButtons = [UIBarButtonItem: UIColor]()
func hideUIBarButtonItem(button: UIBarButtonItem) {
if button.tintColor != UIColor.clear {
tintColorsOfBarButtons[button] = button.tintColor
button.tintColor = UIColor.clear
button.isEnabled = false
}
}
func showUIBarButtonItem(button: UIBarButtonItem) {
if tintColorsOfBarButtons[button] != nil {
button.tintColor = tintColorsOfBarButtons[button]
}
button.isEnabled = true
}
Надеюсь, это сэкономит время другим разработчикам:)
Если у вас есть набор UIBarButtonItem
Чтобы скрыть, например, показывать их только в альбомной ориентации, а затем скрыть или Портрет, вы можете использовать тег и фильтр Swift Array. Давайте предположим, что мы сделали @IBOutlet
ссылка на UIToolBar
:
@IBOutlet weak var toolbar: UIToolbar!
Сначала мы сохраняем элементы панели инструментов в viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
toolbarItems = toolbar.items
}
Установите для свойства тега UIBarButtonItem, который вы хотите показывать в альбомной ориентации, значение 1 или что угодно. Затем переопределите функцию traitCollectionDidChange
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
switch (traitCollection.horizontalSizeClass, traitCollection.verticalSizeClass) {
case (.Compact, .Regular): // iPhone Portrait
let items: [UIBarButtonItem]?
if view.frame.width > 320 { // iPhone 6 & 6S
items = toolbarItems?.filter({ $0.tag < 5 })
} else {
items = toolbarItems?.filter({ $0.tag < 4 })
}
bottomToolbar.setItems(items, animated: true)
case (_, .Compact): // iPhone Landscape
let items = toolbarItems?.filter({ $0.tag < 6 })
bottomToolbar.setItems(items, animated: true)
default: // iPad
break
}
}
В этом примере я установил все UIBarButtonItem
Тег для iPad только до 6, iPhone Пейзаж до 5, а для iPhone 6 & 6+ до 4.
Я сделал это с помощью этого:
navigationItem.setHidesBackButton(true, animated: true)
У меня есть более 2 пунктов меню и удалить / добавить пункт меню это накладные расходы. Этот фрагмент кода работал для меня (с помощью Swift3).
func showMenuItem(){
menuItemQuit.customView?.isHidden = false
menuItemQuit.plainView.isHidden = false
}
func hideMenuItem(){
menuItemQuit.customView?.isHidden = true
menuItemQuit.plainView.isHidden = true
}
Для Свифт 5:
self.viewController?.navigationItem.setLeftBarButton(nil, animated: true)
Если вы используете isPreparingForSegue, вы можете легко адаптировать его, чтобы следующее модальное окно отображалось не как кнопка скрытия, а как кнопка «назад». :)
segue.destination.navigationItem.setLeftBarButton(nil, animated: true)
Попробуй это. (Создайте глобальную переменную newbackbutton)
переопределить func viewDidLoad () {
let newBackButton = UIBarButtonItem()
newBackButton.title = " << Return to Gallery"
newBackButton.style = UIBarButtonItemStyle.Done
newBackButton.target = self
newBackButton.action = "backtoScoutDetail:"
self.navigationItem.rightBarButtonItem = newBackButton
}
override func viewWillAppear(animated: Bool) {
newBackButton.title = ""
self.navigationItem.rightBarButtonItem = newBackButton
}
Вы можете использовать атрибуты текста, чтобы скрыть кнопку панели:
barButton.enabled = false
barButton.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.clearColor()], forState: .Normal)
Также я сделал расширение для UIBarButtonItem со скрытым свойством:
extension UIBarButtonItem {
var titleTextAttributes: [NSObject : AnyObject]! {
set {
setTitleTextAttributes(newValue, forState: .Normal)
}
get {
return titleTextAttributesForState(.Normal)
}
}
private static var savedAttributesKey = "savedAttributes"
var savedAttributes: [NSObject : AnyObject]? {
set {
objc_setAssociatedObject(self, &UIBarButtonItem.savedAttributesKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}
get {
return objc_getAssociatedObject(self, &UIBarButtonItem.savedAttributesKey) as? [NSObject : AnyObject]
}
}
var hidden: Bool {
set {
enabled = !newValue
if newValue {
savedAttributes = titleTextAttributes
// Set a clear text color
var attributes = titleTextAttributes
attributes[NSForegroundColorAttributeName] = UIColor.clearColor()
titleTextAttributes = attributes
}
else {
titleTextAttributes = savedAttributes
}
}
get {
return enabled
}
}
}
У меня была та же проблема с панелью инструментов, которую мне пришлось скрыть и показать ее последнюю кнопку. Поэтому я объявил переменную для хранения UIBarButtonItem и удалил ее из бара или добавил в зависимости от ситуации, например:
внутри класса объявлена переменная var и связана панель инструментов:
var buttonToHide : UIBarButtonItem?
@IBOutlet weak var toolbarOne: UIToolbar!
в viewDidLoad:
buttonToHide = toolbarOne.items![toolbarOne.items!.count - 1] as? UIBarButtonItem
в моем коде я сделал трюк:
if situationOccurrsToHide {
toolbarOne.items!.removeLast()
}
или же
if situationOccursToShow
{
toolbarOne.items!.append(buttonToHide!)
}
Вы можете использовать removeAtIndex или insert(buttonToHide, atIndex: xx), чтобы удалить или повторно вставить кнопку в определенную позицию.
Вы должны быть осторожны, чтобы не вставлять и не удалять кнопку более одного раза.
Надеюсь, поможет.
Чтобы действительно удалить кнопку и освободить место на панели, которое она использовала, вы можете сделать это следующим образом:
- получить массив элементов левой или правой кнопки панели, которые вы хотите изменить
- найдите индекс вашей кнопки и удалите его
- установите обновленный массив в navigationItem
Это всего лишь быстрый пример, и для простоты он содержит принудительные необязательные приведения вниз — я рекомендую вам заменить их проверками. я протестировал его в
var items = navigationItem.rightBarButtonItems
items!.remove(at: items!.firstIndex(of: myUIBarButton)!)
navigationItem.rightBarButtonItems = items
Try these:
self.navigationController?.navigationBar.backItem?.title = ""
navigationItem.backBarButtonItem?.title = ""
navigationItem.leftBarButtonItem?.title = ""
navigationItem.hidesBackButton = true
navigationItem.setLeftBarButtonItem(nil, animated: true)
navigationItem.setRightBarButtonItem(nil, animated: true)