UIBarButtonItem in der Navigationsleiste programmgesteuert?

135

Ich habe mich eine Weile nach dieser Lösung umgesehen, aber keine. zB ist eine Lösung

 self.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: nil), animated: true)

Dieser Code fügt eine Schaltfläche mit dem Bild "Stopp" hinzu. Genau so gibt es andere Lösungen mit "Suchen", "Aktualisieren" usw. Aber was ist, wenn ich programmgesteuert eine Schaltfläche mit dem gewünschten Bild hinzufügen möchte?

Rahul Sonvane
quelle

Antworten:

342

Benutzerdefiniertes Schaltflächenbild ohne Einstellung des Schaltflächenrahmens:

Sie können init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)ein neues Element mit dem angegebenen Bild und anderen Eigenschaften initialisieren.

let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: self, action: Selector("action")) // action:#selector(Class.MethodName) for swift 3
self.navigationItem.rightBarButtonItem  = button1

Überprüfen Sie dieses Apple Doc. Referenz


UIBarButtonItem mit benutzerdefiniertem Schaltflächenbild unter Verwendung des Schaltflächenrahmens

ZUM Swift 3.0

    let btn1 = UIButton(type: .custom)
    btn1.setImage(UIImage(named: "imagename"), for: .normal)
    btn1.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn1.addTarget(self, action: #selector(Class.Methodname), for: .touchUpInside)
    let item1 = UIBarButtonItem(customView: btn1)

    let btn2 = UIButton(type: .custom)
    btn2.setImage(UIImage(named: "imagename"), for: .normal)
    btn2.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn2.addTarget(self, action: #selector(Class.MethodName), for: .touchUpInside)
    let item2 = UIBarButtonItem(customView: btn2)  

    self.navigationItem.setRightBarButtonItems([item1,item2], animated: true)

FÜR Swift 2.0und älter

let btnName = UIButton()
btnName.setImage(UIImage(named: "imagename"), forState: .Normal)
btnName.frame = CGRectMake(0, 0, 30, 30)
btnName.addTarget(self, action: Selector("action"), forControlEvents: .TouchUpInside)

//.... Set Right/Left Bar Button item
let rightBarButton = UIBarButtonItem()
rightBarButton.customView = btnName
self.navigationItem.rightBarButtonItem = rightBarButton

Oder verwenden Sie einfach init (customView :) wie

 let rightBarButton = UIBarButtonItem(customView: btnName)
 self.navigationItem.rightBarButtonItem = rightBarButton

Für System UIBarButtonItem

let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: Selector("btnOpenCamera"))
self.navigationItem.rightBarButtonItem = camera

Für mehr als 1 Artikel verwenden Sie rightBarButtonItemsoder für die linke SeiteleftBarButtonItems

let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
let item1 = UIBarButtonItem()
item1.customView = btn1

let btn2 = UIButton()
btn2.setImage(UIImage(named: "img2"), forState: .Normal)
btn2.frame = CGRectMake(0, 0, 30, 30)
btn2.addTarget(self, action: Selector("action2:"), forControlEvents: .TouchUpInside)
let item2 = UIBarButtonItem()
item2.customView = btn2

self.navigationItem.rightBarButtonItems = [item1,item2]

Verwenden von setLeftBarButtonItemodersetRightBarButtonItem

let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: btn1), animated: true);

Für schnell> = 2.2 sollte Aktion sein #selector(Class.MethodName)... für zbtnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)

EI Captain v2.0
quelle
Gute Antwort. let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(Class.MethodName))
Ich
Ich habe festgestellt, dass Sie den CGRect-Teil angeben müssen, wenn Ihre Schaltfläche auch den Text enthalten soll. Es gibt einige Beispiele für SO, die dies nicht angeben.
Micah Montoya
Vielen Dank für Ihre perfekte Antwort. Es ist nicht schlecht, ein Update für Swift 4 hinzuzufügen.
Milad Faridnia
38

Mit Swift 4oder ist es viel einfacherSwift 4.2

ViewDidLoadDefinieren Sie in Ihrer Methode Ihre Schaltfläche und fügen Sie sie der Navigationsleiste hinzu.

override func viewDidLoad() {
    super.viewDidLoad()

    let logoutBarButtonItem = UIBarButtonItem(title: "Logout", style: .done, target: self, action: #selector(logoutUser))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

}

Dann müssen Sie die Funktion, die Sie im Aktionsparameter erwähnt haben, wie folgt definieren

@objc func logoutUser(){
     print("clicked")
}

Sie müssen das @objcPräfix hinzufügen, da es immer noch das Legacy-Material verwendet (Ziel C).

Jay Mayu
quelle
17

Einfach UIBarButtonItemmit customView einrichten

Beispielsweise:

  var leftNavBarButton = UIBarButtonItem(customView:yourButton)
  self.navigationItem.leftBarButtonItem = leftNavBarButton

oder verwenden setFunction:

  self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);
Löwe
quelle
1
Ich stimme Ihrer Antwort zu, da Ihr Code auch funktioniert, aber Bhavins Code ist eine One-Shot-Lösung, daher werde ich seine Antwort akzeptieren. Vielen Dank für Ihren Beitrag Kumpel :)
Rahul Sonvane
11

Ich bin gerade auf diese Frage gestoßen und hier ist ein Update für Swift 3 und iOS 10:

let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: nil)
self.navigationItem.rightBarButtonItem  = testUIBarButtonItem

Es ist definitiv viel schneller als das Erstellen des UIButton mit allen Eigenschaften und das anschließende Hinzufügen der benutzerdefinierten Ansicht zum UIBarButtonItem.

Und wenn Sie die Farbe des Bildes von Standardblau auf Weiß ändern möchten, können Sie jederzeit die Farbtonfarbe ändern:

test.tintColor = UIColor.white()

PS Du solltest natürlich den Selektor etc. für deine App ändern :)

tech4242
quelle
7

In Swift 3.0+ UIBarButtonItemprogrammgesteuert wie folgt einrichten:

   override func viewDidLoad() {
        super.viewDidLoad()
        let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(self.clickButton))
        self.navigationItem.rightBarButtonItem  = testUIBarButtonItem
    }

   @objc func clickButton(){
            print("button click")
     }
Kushal Shrestha
quelle
3

Einstellen des LeftBarButton mit dem Originalbild.

let menuButton = UIBarButtonItem(image: UIImage(named: "imagename").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(classname.functionname))
self.navigationItem.leftBarButtonItem  = menuButton
Sudhi 9135
quelle
2

Ich habe das gleiche Problem und habe Antworten in einem anderen Thema gelesen, dann löse ich einen anderen ähnlichen Weg. Ich weiß nicht, was effektiver ist. ähnliches Problem

//play button

@IBAction func startIt(sender: AnyObject) {
    startThrough();
};

//play button

func startThrough() {
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true);

    let pauseButton = UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "pauseIt");
    self.toolBarIt.items?.removeLast();
    self.toolBarIt.items?.append( pauseButton );
}

func pauseIt() {
    timer.invalidate();

    let play = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "startThrough");
    self.toolBarIt.items?.removeLast();
    self.toolBarIt.items?.append( play );
}
AngelThread
quelle
1

Das ist eine verrückte Sache mit Apfel. Wenn Sie self.navigationItem.rightBarButtonItem.title sagen, wird null angezeigt, während auf der GUI Bearbeiten oder Speichern angezeigt wird. Fresher mag mich wird viel Zeit brauchen, um dieses Verhalten zu debuggen.

Es ist erforderlich, dass das Element beim ersten Laden Bearbeiten anzeigt und der Benutzer darauf tippt. Es ändert sich in Titel speichern. Um dies zu archivieren, habe ich wie folgt vorgegangen.

// Ansicht wurde geladen sagt Titel bearbeiten

private func loadRightBarItem() {
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
}

// Tippen Sie auf Element bearbeiten wird in Titel speichern geändert

@objc private func handleEditBtn() {
    print("clicked on Edit btn")
    let logoutBarButtonItem = UIBarButtonItem(title: "Save", style: .done, target: self, action: #selector(handleSaveBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
    blockEditTable(isBlock: false)
}

// Tippen Sie auf Speichern, um den Titel Titel bearbeiten anzuzeigen

@objc private func handleSaveBtn(){
    print("clicked on Save btn")
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

    saveInvitation()
    blockEditTable(isBlock: true)

}
Codierer
quelle
1

iOS 11

Festlegen einer benutzerdefinierten Schaltfläche mithilfe einer Einschränkung:

let buttonWidth = CGFloat(30)
let buttonHeight = CGFloat(30)

let button = UIButton(type: .custom)
button.setImage(UIImage(named: "img name"), for: .normal)
button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside)
button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
button.heightAnchor.constraint(equalToConstant: buttonHeight).isActive = true

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(customView: button)
Achyut Sagar
quelle
0
func viewDidLoad(){
let homeBtn: UIButton = UIButton(type: UIButtonType.custom)

        homeBtn.setImage(UIImage(named: "Home.png"), for: [])

        homeBtn.addTarget(self, action: #selector(homeAction), for: UIControlEvents.touchUpInside)

        homeBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30)

        let homeButton = UIBarButtonItem(customView: homeBtn)


        let backBtn: UIButton = UIButton(type: UIButtonType.custom)

        backBtn.setImage(UIImage(named: "back.png"), for: [])

        backBtn.addTarget(self, action: #selector(backAction), for: UIControlEvents.touchUpInside)

        backBtn.frame = CGRect(x: -10, y: 0, width: 30, height: 30)

        let backButton = UIBarButtonItem(customView: backBtn)
        self.navigationItem.setLeftBarButtonItems([backButton,homeButton], animated: true)
}

}
Sai Kumar Reddy
quelle