15 ответов:
Вы действительно хотите скрыть / показать
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 }
// 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: удалено принудительное разворачивание и исправлено включенное значение.
Первый способ:
Просто установите
.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() }
Для Swift 3
if (Show_condition) { self.navigationItem.rightBarButtonItem = self.addAsset_btn } else { 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
Для меня работает следующее решение.
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 }
Если у вас есть набор
UIBarButtonItems, чтобы скрыть, например, только показать их в альбомной ориентации, и скрыть или портрет, вы можете использовать тег и фильтр 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 или любое другое. Затем переопределите функцию
traitCollectionDidChangeoverride 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.
Вы можете использовать текстовые атрибуты, чтобы скрыть кнопку панели:
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 глобальной переменной)
Переопределить функцию 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 }
У меня больше, чем 2 menuitems и 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 }Надеюсь, это сэкономит время другим разработчикам:)
У меня была та же проблема с панелью инструментов, которую я должен был скрыть и показать ее последнюю кнопку. Поэтому я объявил var для удержания 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), чтобы удалить или снова вставить кнопка в определенном положении.
Вы должны быть осторожны, чтобы не вставить или удалить кнопку более одного раза.
Надеюсь, это поможет.
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)
Comments