Wie füge ich eine Schaltfläche zur UINavigationBar hinzu?

Antworten:

294

Beispielcode zum Einstellen der rightbuttonauf a NavigationBar.

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" 
    style:UIBarButtonItemStyleDone target:nil action:nil];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Title"];
item.rightBarButtonItem = rightButton;
item.hidesBackButton = YES;
[bar pushNavigationItem:item animated:NO];

Aber normalerweise hätten Sie eine NavigationController, mit der Sie schreiben können:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;
Mads Mobæk
quelle
1
Ich erhalte eine Warnung zum Stil: Parameter -> Warnung: Semantisches Problem: Implizite Konvertierung vom Aufzählungstyp 'UIBarButtonSystemItem' in einen anderen Aufzählungstyp 'UIBarButtonItemStyle'
Pojo
3
Dies sollte initWithBarButtonSystemItem: UIBarButtonSystemItemDone sein, um die Warnung zu vermeiden.
Jordanien
2
Im Beispiel verstehe ich nicht, woher "Bar" kommt. Was ist die Standard-Top-Bar-Eigenschaft für ein UINavigationItem?
aneuryzm
Die Balkenvariable in der Antwort ist eine Navigationsleiste, die nicht von einem Navigationscontroller verwaltet wird. Wenn Sie über einen Navigationscontroller verfügen, verfügt dieser über eine eigene Navigationsleiste, die verwaltet wird. In diesem Fall sollte jeder Ansichtscontroller, den Sie an den Navigationscontroller senden, ein eigenes Navigationselement konfigurieren (einschließlich des Festlegens des rightBarButtonItem in einem eigenen Navigationselement Eigentum).
Vasiliy Kulakov
Für aktuelle Leser glaube ich nicht, dass es einen Grund gibt, [rightbutton release]unter ARC anzurufen (was zum Zeitpunkt der Erstellung dieses Kommentars noch nicht der Fall war).
Carbokation
20

Die obigen Antworten sind gut, aber ich möchte sie mit ein paar weiteren Tipps ausarbeiten:

Wenn Sie den Titel der Zurück-Schaltfläche ändern möchten (der Pfeil in der linken Ecke der Navigationsleiste), MÜSSEN Sie dies im VORHERIGEN Ansichts-Controller tun, nicht in dem, für den er angezeigt wird. Es ist so, als würde man sagen: "Hey, wenn Sie jemals einen anderen Ansichts-Controller darüber schieben, rufen Sie die Zurück-Schaltfläche" Zurück "(oder was auch immer) anstelle der Standardeinstellung auf."

Wenn Sie die Zurück-Schaltfläche während eines speziellen Status ausblenden möchten, z. B. während eine UIPickerView angezeigt wird, verwenden Sie sie self.navigationItem.hidesBackButton = YES;und denken Sie daran, sie zurückzusetzen, wenn Sie den speziellen Status verlassen.

Wenn Sie eine der speziellen symbolischen Schaltflächen anzeigen möchten, verwenden Sie das Formular initWithBarButtonSystemItem:target:actionmit einem Wert wieUIBarButtonSystemItemAdd

Denken Sie daran, dass die Bedeutung dieses Symbols bei Ihnen liegt. Beachten Sie jedoch die Richtlinien für die Benutzeroberfläche. Wenn Sie UIBarButtonSystemItemAdd verwenden, um ein Element zu löschen, wird Ihre Bewerbung wahrscheinlich abgelehnt.

Amagrammer
quelle
11

Hinzufügen einer benutzerdefinierten Schaltfläche zur Navigationsleiste (mit Bild für buttonItem und Angabe der Aktionsmethode (void) openView {} und).

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 32, 32);
[button setImage:[UIImage imageNamed:@"settings_b.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(openView) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *barButton=[[UIBarButtonItem alloc] init];
[barButton setCustomView:button];
self.navigationItem.rightBarButtonItem=barButton;

[button release];
[barButton release];
Oleh Kudinov
quelle
7

Im folgenden Beispiel wird eine Schaltfläche mit dem Titel "Kontakt" in der Navigationsleiste rechts angezeigt. Seine Aktion ruft eine Methode namens "contact" vom viewcontroller auf. Ohne diese Zeile ist die rechte Schaltfläche nicht sichtbar.

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Contact"
                                                                          style:UIBarButtonItemStylePlain target:self action:@selector(contact:)];;

Geben Sie hier die Bildbeschreibung ein

Tibidabo
quelle
3

In Swift 2 würden Sie Folgendes tun:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton

(Keine große Änderung) In Swift 4/5 wird es sein:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton
NRR
quelle
2

Verwenden Sie Folgendes: (über die Schaltfläche Benutzerdefinierte Zurück zeichnen in der iPhone-Navigationsleiste )

// Add left
UINavigationItem *previousItem = [[UINavigationItem alloc] initWithTitle:@"Back title"];
UINavigationItem *currentItem = [[UINavigationItem alloc] initWithTitle:@"Main Title"];
[self.navigationController.navigationBar setItems:[NSArray arrayWithObjects:previousItem, currentItem, nil] animated:YES];

// set the delegate to self
[self.navigationController.navigationBar setDelegate:self];
Joe
quelle
0

schnell 3

    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(cancelPressed(_:)))
    cancelBarButton.setTitleTextAttributes( [NSFontAttributeName : UIFont.cancelBarButtonFont(),
                                                          NSForegroundColorAttributeName : UIColor.white], for: .normal)
    self.navigationItem.leftBarButtonItem = cancelBarButton


    func cancelPressed(_ sender: UIBarButtonItem ) {
        self.dismiss(animated: true, completion: nil)
    }
venky
quelle