2014-12-24 16 views
16

Ich möchte den navigationbar Titel anklickbar machen. Wenn ein Benutzer darauf klickt, sollte er einen Übergang durchführen. Aber ich habe keine Ahnung, wie ich das machen soll.Den Titel der Navigationsleiste anklickbar machen swift

Ich habe Folgendes versucht, um den Titel zu erhalten und die Tap-Geste darauf anzuwenden.

var subviews = self.navigationController?.navigationBar.subviews 
     if let subviews = subviews { 
      // Better check for array length before accessing to the 1st element 
      var subview = subviews [0] 
     } 

aber sein gibt Fehler mir Variable subview inferred to have type AvyObject, which may be unexpected

Antwort

47

Ein weiterer Ansatz zum Hinzufügen der Schaltfläche als Titel des Navigationscontrollers.

Sie müssen Navigationspunkt Titelansicht auf Ihre Schaltfläche Objekt

Schaltfläche Erstellen Objekt in viewDidLoad() Verfahren eingestellt:

Swift 3.0 bearbeiten

let button = UIButton(type: .custom) 
button.frame = CGRect(x: 0, y: 0, width: 100, height: 40) 
button.backgroundColor = UIColor.red 
button.setTitle("Button", for: .normal) 
button.addTarget(self, action: #selector(self.clickOnButton), for: .touchUpInside) 
self.navigationItem.titleView = button 

Hier können Sie in letzter Zeile sehen Schaltfläche wird direkt auf titleView von navigationItem gesetzt, die Schaltfläche in der Mitte der Navigationsleiste hinzufügen wird.

Aktionsmethode für Taste ist unten:

func clickOnButton(button: UIButton) { 
} 
+1

Ich habe verschiedene Möglichkeiten ausprobiert, wie UILabel zu verwenden und tapste, aber vor allem war diese Lösung die sauberste, einfachste und effizienteste Methode. – Bigair

+0

Wenn Ihnen das Storyboard gefällt: Sie können auch ein IBOutlet hinzufügen und dann die titleView als IBOutlet festlegen. self.navigationItem.titleView = titleButton – Pbk

0

Um diesen Fehler loszuwerden, einen Typen für Ihre if let Konstante angeben. Ich würde auch empfehlen, den if let Konstantennamen zu ändern, da dieser der gleiche ist wie der bereits in der vorherigen Zeile deklarierte.

var subviews = self.navigationController?.navigationBar.subviews 
if let subviewArray:NSArray = subviews { 
    // Better check for array length before accessing to the 1st element 
    var subview:UILabel = subviewArray[0] // <-- If the subview's a UILabel 
} 
+0

es immer noch das gleiche Problem. –

+0

@AtifFarrukh die gleiche Fehlermeldung? –

+0

ja, die gleiche Nachricht –

3

Kampai Antwort für Swift aktualisiert 3:

let button = UIButton(type: .custom) 
button.frame = CGRect(x: 0, y: 0, width: 100, height: 40) 
button.setTitle("Button", for: .normal) 
button.addTarget(self, action: #selector(self.clickOnButton), for: .touchUpInside) 
self.navigationItem.titleView = button 
1

Ich kann "Antwort aktualisiert Kampai der für Swift 3:" bestätigen funktioniert auch für Xcode 9/iOS11:

private func setTouchable(title: String){ 
      let button = UIButton(type: .custom) 
      button.frame = CGRect(x: 0, y: 0, width: 80, height: 40) 
      button.setTitle(title, for: .normal) 
      button.addTarget(self, 
      action: #selector(self.btnAction), 
      for: .touchUpInside) 
      self.navigationItem.titleView = button 
     } 



     @objc func btnAction(sender: Any){ 
      print("Got it!"); 
     } 


.... 
// for example in viewDidLoad: 
      setTouchable(title: "TOUCHME") 
Verwandte Themen