2016-04-03 8 views
3

Ich habe eine UINavigationController, die die UIBarButtonItem in der oberen rechten Ecke ändert, abhängig vom Status der App.Warum wird mein UIButton in einem UIBarButtonItem nicht in der Navigationsleiste angezeigt?

Wenn Ansicht Last habe ich die Tasten initialisieren muss ich

var editBarButton: UIBarButtonItem! 
var logoutBarButton: UIBarButtonItem! 
var showRepositoryBarButton: UIBarButtonItem! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    editButton = UIButton() 
    editButton.setImage(UIImage(named: "icon pencil"), forState: .Normal) 
    editButton.frame = CGRectMake(0, 0, 30, 30) 
    editButton.addTarget(self, action: #selector(UserProfileNavigatorController.onEditClick), forControlEvents: .TouchUpInside) 
    editBarButton = UIBarButtonItem(customView: editButton) 

    let logoutButton = UIButton() 
    logoutButton.setImage(UIImage(named: "icon logout"), forState: .Normal) 
    logoutButton.frame = CGRectMake(0, 0, 30, 30) 
    logoutButton.addTarget(self, action: #selector(UserProfileNavigatorController.onLogoutClick), forControlEvents: .TouchUpInside) 
    logoutBarButton = UIBarButtonItem(customView: logoutButton) 

    let showRepositoryButton = UIButton() 
    logoutButton.setImage(UIImage(named: "icon logout"), forState: .Normal) 
    logoutButton.frame = CGRectMake(0, 0, 30, 30) 
    logoutButton.addTarget(self, action: #selector(UserProfileNavigatorController.onShowRepositoryOnWebClick), forControlEvents: .TouchUpInside) 
    showRepositoryBarButton = UIBarButtonItem(customView: showRepositoryButton) 

    presenter.viewDidLoad() 
} 

Und je nach der Situation, die ich ändern, die auf diese Weise angezeigten Schaltflächen

func showUserProfile() { 
    navigationItem.setRightBarButtonItems([editBarButton, logoutBarButton], animated: false) 
    Router.showUserProfileInNavigatorController(self) 
} 

func showRepository(repository: Repository) { 
    navigationItem.setRightBarButtonItems([showRepositoryBarButton], animated: false) 
    Router.showRepository(self, repository: repository) 
} 

Auch wenn dieser Code tatsächlich ausgeführt wird, In der oberen rechten Ecke erscheint nichts.

+0

Können Sie etwas mehr Code posten? I.e. viewDid/WillAppear und wo Sie showUserProfile etc. aufrufen. –

Antwort

1

Das Problem war, dass dieser Code in den UINavigationController ausgeführt wurde. Stattdessen muss der UIViewController die Tasten im UINavigationController zeigen.

So funktioniert nur das Verschieben des Codes innerhalb der UIViewController funktioniert.

+0

Nun, der showRepositoryButton zeigte nicht - das war ein Bug, auf den ich unten hingewiesen habe. Wirklich überrascht, nicht einmal ein Dankeschön für meine lange und detaillierte Antwort zu bekommen ... –

+1

@DavidH Sorry, wenn ich unhöflich zu sein schien. Ihre Lösung funktionierte eigentlich nicht, obwohl Sie einen anderen Fehler richtig erkannt haben. Danke dafür trotzdem. –

0

Beachten Sie, dass es mehrere Probleme mit Ihrem Code gibt. Beachten Sie zunächst, dass UIButton() zwar ein nicht-optionales Objekt zurückgibt, aber UIImage möglicherweise ein optionales Objekt zurückgibt. Sie haben also wirklich keine Ahnung, ob Sie die Namen Ihrer Bilder richtig eingegeben haben. Ich habe ein einfaches Projekt mit dem obigen Code ohne Bilder erstellt und dupliziert, dass nichts angezeigt wird, wenn die Bilder null sind.

Dann Bilder hinzufügen, ich habe nur zwei Bilder angezeigt. Bei genauerer Betrachtung Ihres Codes definiert das 3. Bild loginButton neu, setzt aber keine Eigenschaften auf showRepositoryButton.

Mehrere Vorschläge:

  • uns "do {...}" einen Unter Kontext zu schaffen, zu vermeiden unbeabsichtigte variable Nachnutzung
  • wenn ein UIButton, verwenden Sie den benannten Initialisierer (UIButton (Typ : ...)
  • besser noch, verwenden Sie ein UIBarButtonItem (Bild: ...)
  • zahlen Sie wirklich Aufmerksamkeit auf Optionals, und lassen Zwangsauspacken Absturz zur geeigneten Zeit (oder verwenden Sie eine Assert, Wache oder Vorbedingung)

Ohne Code drastisch zu ändern, hier ist das, was für mich gut funktioniert:

override func viewDidLoad() { 
    super.viewDidLoad() 

    navigationItem.title = "Howdie!" 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "02-redo")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onEditClick), forControlEvents: .TouchUpInside) 
     editBarButton = UIBarButtonItem(customView: button) 
    } 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "03-loopback")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onLogoutClick), forControlEvents: .TouchUpInside) 
     logoutBarButton = UIBarButtonItem(customView: button) 
    } 

    do { 
     let button = UIButton() 
     let image = UIImage(named: "04-squiggle")! 
     button.setImage(image, forState: .Normal) 
     button.frame = CGRectMake(0, 0, 30, 30) 
     button.addTarget(self, action: #selector(onShowRepositoryOnWebClick), forControlEvents: .TouchUpInside) 
     showRepositoryBarButton = UIBarButtonItem(customView: button) 
    } 

    navigationItem.setRightBarButtonItems([editBarButton, logoutBarButton, showRepositoryBarButton], animated: false) 
}