Wie füge ich 2 Schaltflächen ohne IB zur UINavigationbar auf der rechten Seite hinzu?

86

Wie kann ich UINavigationBarohne XIB 2 Schaltflächen hinzufügen ?
Die 2 Tasten sollten auf der rechten Seite des ausgerichtet sein UINavigationBar.

Ich weiß, wie ich eine Schaltfläche hinzufügen kann, aber wie wäre es mit zwei?

Alexander
quelle

Antworten:

142

Mit iOS 5+ ist es so einfach wie:

UIBarButtonItem *btnShare = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(share)];
UIBarButtonItem *btnRefresh = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:btnShare, btnRefresh, nil]];
Domsom
quelle
Ich denke, es ist auch in iOS 5 verfügbar.
iAmd
1
Schön und einfach! Ich habe auch die vorhandene rechte Schaltfläche (in IB festgelegt) eingefügt. UIBarButtonItem * btnCurrent = self.navigationItem.rightBarButtonItem;
Duncan
43

Ich habe Code (siehe unten) gepostet , um zwei Schaltflächen rechts von der Navigationsleiste hinzuzufügen. Sie können barStyle = -1anstelle von Unterklassen festlegen UIToolbar.

UIToolbar *tools = [[UIToolbar alloc]
                    initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)]; // 44.01 shifts it up 1px for some reason
tools.clearsContextBeforeDrawing = NO;
tools.clipsToBounds = NO;
tools.tintColor = [UIColor colorWithWhite:0.305f alpha:0.0f]; // closest I could get by eye to black, translucent style.
                                                              // anyone know how to get it perfect?
tools.barStyle = -1; // clear background
NSMutableArray *buttons = [[NSMutableArray alloc] initWithCapacity:3];

// Create a standard refresh button.
UIBarButtonItem *bi = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
[buttons addObject:bi];
[bi release];

// Create a spacer.
bi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
bi.width = 12.0f;
[buttons addObject:bi];
[bi release];

// Add profile button.
bi = [[UIBarButtonItem alloc] initWithTitle:@"Profile" style:UIBarButtonItemStylePlain target:self action:@selector(goToProfile)];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];
[bi release];

// Add buttons to toolbar and toolbar to nav bar.
[tools setItems:buttons animated:NO];
[buttons release];
UIBarButtonItem *twoButtons = [[UIBarButtonItem alloc] initWithCustomView:tools];
[tools release];
self.navigationItem.rightBarButtonItem = twoButtons;
[twoButtons release];
ma11hew28
quelle
Dies war der erste Beitrag, den ich gefunden habe und der eine zusätzliche Symbolleiste enthält, mit der er mit verschiedenen Hintergrundfarben funktioniert, danke
Chris
Dies ist die richtige Antwort auf diese Frage ... Der Code in diesem Link funktioniert perfekt ... du großartiger Mann ... Prost ... :) Alle anderen Antworten oben sind falsch und funktionieren nicht
Sameera Chathuranga
Die Lösung funktioniert nicht einwandfrei, wenn Sie den Navigationscontroller als contentViewController von UIPopoverController präsentieren. Wenn Sie UIToolbar als benutzerdefinierte Ansicht von leftBarButtonItem festlegen, ist der Berührungsbereich der zweiten Schaltfläche falsch (nach links verschoben, dh die rechte Seite der zweiten Schaltfläche kann nicht angeklickt werden). Wenn es um rightBarButtonItem geht, wird die zweite Schaltfläche falsch gezeichnet (nur die linke Seite wird gezeichnet) ... In diesem Fall muss ich mich an die Verwendung einer benutzerdefinierten UIToolbar als Header anstelle von UINavigationBar halten, denke ich ...
manicaesar
1
Einer der Tricks hier ist die tools.barStyle = -1Zeile: Ohne diese gibt es einige visuelle Artefakte, wenn Sie UIBarStyleBlack mit translucent = YES verwenden. (Die Hintergrundfarbe stimmt nämlich nicht mit der der Navigationsleiste überein.) Ist das eine undokumentierte Funktion? Wenn ja, ist dieser Code etwas zerbrechlich. Ich habe das nirgendwo in den Dokumenten gesehen.
ettore
28

Sie können eine mit einer Symbolleiste initialisierte Balkenschaltfläche als benutzerdefinierte Ansicht verwenden.

UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)];
NSArray* buttons = [NSArray arrayWithObjects:self.editButtonItem, someOtherButton, nil];
[toolbar setItems:buttons animated:NO];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar];

Würde so etwas geben:

Alt-Text

Hinweis: Diese Antwort ist für iOS 6 oder höher veraltet

Nathan
quelle
3
@SameeraChathuranga Sie können diesen Code nicht einfach kopieren und einfügen, ohne etwas zu tun. Sie müssen sicherstellen, dass 'self.editButtonItem' und 'someOtherButton' zuerst irgendwo definiert werden ...
Nathan
Hallo! Danke für den Ausschnitt. Damit habe ich zwei Schaltflächen erfolgreich hinzugefügt, aber es gibt ein kleines Problem. So sieht es aus. Wie Sie sehen können, ist um die Symbolleiste ein leichter quadratischer Rand sichtbar. Wie kann ich dies entfernen und nahtlos gestalten, wie Sie es in Ihrem Screenshot oben haben? Vielen Dank. :)
Isuru
Seltsam, ich bekomme den Rand nicht auf die Schaltfläche "Hinzufügen". Ich bekomme nur einen Rahmen, wenn ich UIBarButtonStyles verwende, die kein Symbol haben.
Pojo
23

Hier ist das Arbeitsbeispiel aus meinem aktuellen Projekt:

zwei Schaltflächen in der UINavigationbar rightBarButtonItem

UIButton *homeBtn =  [UIButton buttonWithType:UIButtonTypeCustom];
[homeBtn setImage:[UIImage imageNamed:@"home-icon"] forState:UIControlStateNormal];
//[homeBtn addTarget:self action:@selector(home) forControlEvents:UIControlEventTouchUpInside];
[homeBtn setFrame:CGRectMake(0, 0, 32, 32)];

UIButton *settingsBtn =  [UIButton buttonWithType:UIButtonTypeCustom];
[settingsBtn setImage:[UIImage imageNamed:@"settings-icon"] forState:UIControlStateNormal];
//[settingsBtn addTarget:self action:@selector(settings) forControlEvents:UIControlEventTouchUpInside];
[settingsBtn setFrame:CGRectMake(44, 0, 32, 32)];

UIView *rightBarButtonItems = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 76, 32)];
[rightBarButtonItems addSubview:homeBtn];
[rightBarButtonItems addSubview:settingsBtn];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightBarButtonItems];
Adnan
quelle
18
UINavigationBar *navBarView = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 320.0f, 42.0f)];
    navBarView.tintColor= [UIColor colorWithRed:90.0/255.0f green:53.0/255.0f blue:45.0/255.0f alpha:1.0];

    UIBarButtonItem *left=[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backView)];
    UIBarButtonItem *right=[[UIBarButtonItem alloc]initWithTitle:@"Save" style:UIBarButtonItemStylePlain target:self action:@selector(SaveImage)];
    UIBarButtonItem *Add=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(AddComment:)];

    UINavigationItem *navigationItem = [[UINavigationItem alloc] init];
    navigationItem.leftBarButtonItem = left;
    NSMutableArray *buttonArray=[[NSMutableArray alloc]initWithCapacity:2];
    [buttonArray addObject:right];
    [buttonArray addObject:Add];
    navigationItem.rightBarButtonItems = buttonArray;
    [navBarView pushNavigationItem:navigationItem animated:NO];
[self.view addSubView:navBarView];
Gurpreet Singh
quelle
14

Schnell:

override func viewDidLoad() {
    super.viewDidLoad()

    // Additional bar button items
    let button1 = UIBarButtonItem(image: UIImage(named: "image1.png"), style: .Plain, target: self, action: "methodA")
    let button2 = UIBarButtonItem(image: UIImage(named: "image2.png"), style: .Plain, target: self, action: "methodB")
    let button3 = UIBarButtonItem(image: UIImage(named: "image3.png"), style: .Plain, target: self, action: "methodC")

    navigationItem.leftItemsSupplementBackButton = true
    navigationItem.setLeftBarButtonItem(button1, animated: true)
    navigationItem.setRightBarButtonItems([button2, button3], animated: true)

Methoden für Schaltflächen:

func methodA() {
    performSegueWithIdentifier("segA", sender: nil)
}

func methodB() {
    performSegueWithIdentifier("segB", sender: nil)
}

func methodC() {
    performSegueWithIdentifier("segC", sender: nil)
}
LondonGuy
quelle
9

SCHNELL

Sie können in tun swift wie diese

        var editImg   : UIImage = UIImage(named: "plus")!
        var searchImg : UIImage = UIImage(named: "search")!
        
        var editBtn : UIBarButtonItem = UIBarButtonItem(image: editImg,  style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editBtnPressed:"))
        
        var searchBtn : UIBarButtonItem = UIBarButtonItem(image: searchImg,  style: UIBarButtonItemStyle.Plain, target: self, action: Selector ("searchBtnPressed:"))
        
        var buttons : NSArray = [editBtn, searchBtn]
        
        self.navigationItem.rightBarButtonItems = buttons

        func editBtnPressed(sender: AnyObject){
        
        }
    
        func searchBtnPressed(sender: AnyObject){
        
        }
Dharmbir Singh
quelle
7

Sie können eine UIView erstellen und dieser Schaltfläche zwei Schaltflächen hinzufügen. Und füge das UIView als rechten Button hinzu :)

UIView* rightItem = [UIView alloc] initWithFrame:frame];
//Create UIButton1 b1
//Create UIButton2 b2
[rightItem addSubview:b1];
[rightItem addSubview:b2];

self.navigationItem.rightBarButtonItem = rightItem;
Prakash
quelle
@ NathanReed, es sollte sein self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightItem];(Vollständiges Arbeitscode- Beispiel unten [von mir])
Adnan
7

Die Prakash-Antwort funktioniert auch im Interface Builder.

Ziehen Sie ein UIViewin das UINavigationItem, dann können Sie mehrere UIButtonals untergeordnete Elemente davon einfügen UIViewund eine Hierarchie wie folgt erstellen:

Navigationsleiste mit 3 Schaltflächenhierarchie

Stellen Sie die Hintergrundfarbe von ein UIView, um die Schaltflächen zu löschen, und fügen Sie einige Einschränkungen hinzu, um die Schaltflächen vertikal zu zentrieren und die horizontale Position festzulegen. Hier ist das Ergebnis, das ich mit der Codezeile Null erhalten habe:

Ergebnis im Simulator

Axel Guilmin
quelle
1
Das funktioniert! Für diejenigen, die genauso verwirrt sind wie ich, habe ich das Balkenschaltflächenelement durch das UIView ersetzt, indem ich es wie beschrieben auf das UINavigationItem gezogen habe. Danach ist es genau so, als würden Sie Schaltflächen in Ihre Szene ziehen und Einschränkungen hinzufügen. Ein großes Lob für diese Lösung, denn ohne Code kann ich dies jetzt tun und durch einfaches Ziehen der Schaltflächen im Storyboard einen Übergang zu verschiedenen Szenen erstellen :) Danke!
Bruce
2
Dies wird überhaupt nicht benötigt. Sie können Balkenschaltflächenelemente einfach auf die rechte Balkenschaltfläche ziehen. Xcode 7.3.1
João Nunes
4

In SWIFT können Sie diesen Code hinzufügen, um zwei Schaltflächen auf der rechten (oder linken) Seite einzurichten:

self.navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Action, target: self, action: "barButtonItemClicked"), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "barButtonItemClicked")]
Alberto Bailac Moreno
quelle
3

Hier ist der Swift 4-Code:

    let editImage   = UIImage(named: "plus")!
    let searchImage = UIImage(named: "search")!
    let editButton   = UIBarButtonItem(image: editImage,  style: .plain, target: self, action:#selector(didTapEditButton))
    let searchButton = UIBarButtonItem(image: searchImage,  style: .plain, target: self, action:#selector(didTapSearchButton))
    navigationItem.rightBarButtonItems = [editButton, searchButton]


 @objc func didTapEditButton(sender: AnyObject){

  }

 @objc func didTapSearchButton(sender: AnyObject){

  }
Mannam Brahmam
quelle
2

Sie müssen nicht zwei Schaltflächen hinzufügen. Sie müssen nur hinzufügen

UIBarButtonSystemItemFlexibleSpace 

nicht

UIBarButtonSystemItemFixedSpace

und einen Knopf, so dass es auf der rechten Seite ist.

So was:

UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
toolbar.barStyle = UIBarStyleBlackTranslucent;

UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

UIBarButtonItem *infoButtonItem1 = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(empresaTextFieldDone)];    

toolbar.items = [NSArray arrayWithObjects: spaceButton, infoButtonItem1, nil];   
Bruno
quelle
2
UIView* buttonsView= [[UIView alloc] initWithFrame:CGRectMake(10, 6, 84, 32)];
buttonsView.backgroundColor=[UIColor clearColor];

btn_back = [UIButton buttonWithType:UIButtonTypeCustom];
[btn_back addTarget:self action:@selector(backButtonClick) 
forControlEvents:UIControlEventTouchUpInside];
btn_back.frame = CGRectMake(0, 0, 32, 32);
btn_back.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"close.png"]];

btn_help = [UIButton buttonWithType:UIButtonTypeCustom];
[btn_help addTarget:self action:@selector(helpButtonClick) 
 forControlEvents:UIControlEventTouchUpInside];
btn_help.frame = CGRectMake(42, 0, 32, 32);
btn_help.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"info.png"]];

[buttonsView addSubview:btn_back];
[buttonsView addSubview:btn_help];

segmentItem = [[UIBarButtonItem alloc] initWithCustomView:buttonsView];
self.navigationItem.rightBarButtonItem = segmentItem;
SURESH SANKE
quelle
1

Falls jemand wie ich hierher kommt und nach einer MonoTouch-Antwort sucht, ist das NavigationItem.RightBarButtonItemsArray genau das Richtige für Sie .

Dan Abramov
quelle
1

in SWIFT:

(Angenommen, Sie haben einen Navigations-Controller.) Verwenden Sie im Root-Controller diesen Code:

links: ..

    let leftBtn =  UIBarButtonItem(title: "Do It", style: UIBarButtonItemStyle.Plain,
        target: self, action: "doIt:")
    leftBtn.tag=100
    self.navigationItem.leftBarButtonItem = leftBtn

richtig:

    let rightView = UIView(frame:  CGRectMake(0, 0, 100, 30))
    rightView.backgroundColor = UIColor.redColor()

    let btn1 = UIButton(frame: CGRectMake(0,0,60, 20))
    btn1.setTitle("R1", forState: UIControlState.Normal)
    btn1.tag=101
    btn1.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside)
    rightView.addSubview(btn1)

    let btn2 = UIButton(frame: CGRectMake(30,0,60, 20))
    btn2.setTitle("R2", forState: UIControlState.Normal)
    btn2.tag=102
    btn2.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside)
    rightView.addSubview(btn2)


    let rightBtn = UIBarButtonItem(customView: rightView)
    self.navigationItem.rightBarButtonItem = rightBtn;

..

wo:

 func doIt(sender: AnyObject!){
    let tag = sender.tag

}
ing.conti
quelle
0
    func makeCustomNavigationBar () {

        // Create the navigation bar
        let navigationBar = UINavigationBar(frame: CGRectMake(0, 20, self.view.frame.size.width, 44)) // Offset by 20 pixels vertically to take the status bar into account
        navigationBar.backgroundColor = UIColor.init(hexString: "E43037")
        navigationBar.delegate = self;

        navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
        navigationBar.shadowImage = UIImage()
        navigationBar.translucent = true

        // Create a navigation item with a title
        let navigationItem = UINavigationItem()
        navigationBar.tintColor = UIColor.whiteColor()

        navigationItem.title = "Forgot Password"
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

        // Create left and right button for navigation item
        let leftButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
        leftButton.action = "returnToLoginView"

        let backbuttonImageView =  UIImageView(frame: CGRectMake(0, 0, 30, 30))
        backbuttonImageView.image = UIImage(named: "nav-arrow-left")
        leftButton.image = backbuttonImageView.image
        navigationItem.leftBarButtonItem = leftButton


let rightButton = UIBarButtonItem(title: "Right", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
        rightButton.action = "navigateToDashBoardView"

        let rightButtonImageView =  UIImageView(frame: CGRectMake(0, 0, 30, 30))
        rightButtonImageView.image = UIImage(named: "nav-arrow-left")
        rightButton.image = backbuttonImageView.image
        navigationItem.rightBarButtonItem = rightButton

        // Assign the navigation item to the navigation bar
        navigationBar.items = [navigationItem]

        // Make the navigation bar a subview of the current view controller
        self.view.addSubview(navigationBar)
    }
AG
quelle