У меня есть IBOutlet, с которым я связан с раскадровкой
@IBOutlet var creeLigueBouton: UIBarButtonItem!
и я хочу, чтобы оно исчезло, если условие истинно
if(condition == true)
{
    // Make it disappear
}
У меня есть IBOutlet, с которым я связан с раскадровкой
@IBOutlet var creeLigueBouton: UIBarButtonItem!
и я хочу, чтобы оно исчезло, если условие истинно
if(condition == true)
{
    // Make it disappear
}
Вы действительно хотите скрыть/показать 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")
    }
}
Используйте свойство enabled и tintColor
    let barButtonItem:UIBarButtonItem? = nil
    if isHidden{
        barButtonItem?.enabled      = false
        barButtonItem?.tintColor    = UIColor.clearColor()
    }else{
        barButtonItem?.enabled      = true
        barButtonItem?.tintColor    = nil
    }
Первый способ:
Просто установите .title на ""
Второй способ:
Просто вызовите updateToolBar() всякий раз, когда вы хотите показать/скрыть 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()
}
// 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
        }
    }
}
EDIT: Удалено принудительное разворачивание и фиксированное разрешенное значение.
Для Swift 3
if (Show_condition) {
  self.navigationItem.rightBarButtonItem = self.addAsset_btn
 }
else {
  self.navigationItem.rightBarButtonItem = nil
 }
Следующее решение работает для меня.
        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
Если у вас есть набор 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 или что угодно. Затем переопределите func 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 Landscape - 5, а для iPhone 6 и 6+ - 4.
У меня была такая же проблема с панелью инструментов, что мне пришлось скрыть и показать ее последнюю кнопку. Поэтому я объявил var для хранения UIBarButtonItem и удалил его из панели или добавил в зависимости от ситуации вроде:
внутри класса, объявленного var и связанного с панелью инструментов:
var buttonToHide : UIBarButtonItem?
@IBOutlet weak var toolbarOne: UIToolbar!
в представленииDidLoad:
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) для удаления или повторной установки кнопки в определенной позиции.
Вы должны быть осторожны, чтобы не вставлять или удалять кнопку более одного раза.
Надеюсь, что это поможет.
Вы можете использовать текстовые атрибуты, чтобы скрыть кнопку панели:
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
        }
    }
}
Попробуйте это. (Сделать глобальную переменную newbackbutton)
override 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        
     }
Я сделал это, используя это:
navigationItem.setHidesBackButton(true, animated: true)
У меня больше, что 2 элемента меню и remove/add menuitem являются накладными расходами. Этот фрагмент кода работал у меня (с использованием Swift3).
func showMenuItem(){
    menuItemQuit.customView?.isHidden = false
    menuItemQuit.plainView.isHidden = false
}
func hideMenuItem(){
    menuItemQuit.customView?.isHidden = true
    menuItemQuit.plainView.isHidden = 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
    }
Надеюсь, это сэкономит время другим разработчикам:)
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)