web-dev-qa-db-ja.com

Swift IOSを使用してUIBarButtonItemを非表示にします

ストーリーボードからリンクしたIBOutletがあります

@IBOutlet var creeLigueBouton: UIBarButtonItem!

条件が真である場合、それを非表示にしたい

if(condition == true)
{
    // Make it disappear
}
34

本当に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")
    }

}
34
Imanou Petit

プロパティenabledとtintColorを使用します

    let barButtonItem:UIBarButtonItem? = nil

    if isHidden{
        barButtonItem?.enabled      = false
        barButtonItem?.tintColor    = UIColor.clearColor()
    }else{
        barButtonItem?.enabled      = true
        barButtonItem?.tintColor    = nil
    }
45
haiLong
// 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
        }
    }
}

編集:強制的なアンラップを削除し、有効な値を修正しました。

12
Marc

Swiftの場合

if (your_condition) {
  self.navigationItem.rightBarButtonItem = self.addAsset_btn
 }
else {
  // hide your button
  self.navigationItem.rightBarButtonItem = nil
 }

最初の方法:

_.title_を_""_に設定するだけです

2番目の方法:

creeLigueBoutonを表示/非表示にしたいときはいつでもupdateToolBar()を呼び出すだけです。

_func updateToolBar() {
    var barItems: [UIBarButtonItem] = []

    if condition != true {
        // Make it appear
        barItems.append(creeLigueBouton)
    }

    barItems.append(anotherButton)

    myToolBar.setItems(barItems, animated: true)

    myToolBar.setNeedsLayout()
}
_
5

次の解決策は私のために動作します。

        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
2
kennydust

非表示にするUIBarButtonItemsのセットがある場合、たとえば横向きでのみ表示し、非表示またはポートレートで、タグとSwift配列のフィルターを使用できます。@IBOutletUIToolBarへのリンク:

@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
    }
  }

この例では、iPadのUIBarButtonItemのタグをすべて6に設定し、iPhone Landscapeを5に、iPhone 6および6+を4に設定します。

1
roel

返信するのはかなり遅いですが、私の問題に対する答えを探して、このトピックを見つけました。マークされた答えは役に立たなかったが、@ 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
    }

他の開発者の時間を節約できることを願っています:)

1
user2855896

テキスト属性を使用して、バーボタンを非表示にできます。

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
        }
    }
}
0
iUrii

これを試して。 (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        

     }
0
A.G

ツールバーにも同じ問題があり、最後のボタンを非表示にして表示する必要がありました。そこで、UIBarButtonItemを保持する変数を宣言し、バーから削除するか、次のような状況に応じて追加しました。

クラス内で変数を宣言し、ツールバーをリンクしました:

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)を使用して、特定の位置でボタンを削除または再挿入できます。

ボタンを複数回挿入または削除しないように注意する必要があります。

それが役に立てば幸い。

0
Fabio Vaz

私はこれを使ってそれをしました:

navigationItem.setHidesBackButton(true, animated: true)
0
Nuno Gonçalves

2つ以上のメニュー項目があり、メニュー項目の削除/追加はオーバーヘッドです。このコードスニペットは私のために働いた(Using Swift3)

func showMenuItem(){

    menuItemQuit.customView?.isHidden = false
    menuItemQuit.plainView.isHidden = false
}

func hideMenuItem(){

    menuItemQuit.customView?.isHidden = true
    menuItemQuit.plainView.isHidden = true
}
0
Manikanta