2013-10-31 2 views
16

Wenn ich einen benutzerdefinierten Back-Button erstellen, ich bin mit dem folgenden Code:Erstellen Sie eine benutzerdefinierte links zurück-Taste auf UINavigationBar mit dem Standard-Pfeil auf der linken Seite

UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithTitle:@"Yeah" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonPressed:)]; 
self.navigationItem.leftBarButtonItem = leftButton; 

Dies funktioniert gut, und ich erhalten dieses Ergebnis :

enter image description here

würde ich das gleiche Ergebnis haben, aber mit einem Pfeil auf der linken Seite, wie folgt aus (wenn es eine Standard-zurück-Taste, kein Sonderanfertigung):

enter image description here

Wie kann ich diesen Pfeil einfach hinzufügen?

Antwort

20

Schließlich ist hier die Schnipsel Ich benutze den Zurück-Button Titel mit der Standard-links zu definieren in der aktuellen Ansicht arrow, nicht in der übergeordneten Ansicht:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self setTitle:@"Current View"]; 

    // Get the previous view controller 
    UIViewController *previousVC = [self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count - 2]; 

    // Create a UIBarButtonItem 
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"FooBar" style:UIBarButtonItemStyleBordered target:self action:@selector(yourSelector)]; 

    // Associate the barButtonItem to the previous view 
    [previousVC.navigationItem setBackBarButtonItem:barButtonItem]; 
} 

Hier ist das Ergebnis:

enter image description here

Hinweis: Da es jedoch nicht möglich ist, eine Aktion für ein backBarButtonItem hinzuzufügen, können Sie auf this great post verweisen, wenn Sie es möchten.

+1

Whoohoo! Ich kann Ihnen nicht sagen, wie lange ich nach dieser Lösung gesucht habe ... Danke. Funktioniert wie ein Charme ... – Stephan

+0

Große Antwort !!! – Shashi3456643

0

gut müssen Sie mit einem Hintergrundbild gehen und mit Titel und

// Creates a back button instead of default behaviour (displaying title of previous screen) 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"] 
                   style:UIBarButtonItemStyleBordered 
                   target:self 
                   action:@selector(backAction)]; 

tipsDetailViewController.navigationItem.leftBarButtonItem = backButton; 
[backButton release]; 
17

Die einfachste Sache, den Titel zu setzen wäre zu tun, in der übergeordneten Steuerung (dh die, die Sie zurück nav wollen). Wenn Sie nicht möchten, dass dies mit dem tatsächlichen Titel übereinstimmt, der in der VC-Ansicht angezeigt wird, können Sie den Titel in viewWillDisappear auf die Schaltfläche "Zurück" des nächsten VCs ändern und dann wieder auf den gewünschten Wert in der Ansicht zurückstellen Eltern in viewWillAppear.

Wenn Sie Storyboards verwenden, können Sie den Back-Titel auch direkt in IB festlegen.

Schließlich, um eine benutzerdefinierte Back-Button zu erstellen, können Sie so etwas wie:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Details" style:UIBarButtonItemStyleBordered target:nil action:nil]; 

... nur sicher sein, dies in dem präsentierenden zu tun (oder Eltern) View-Controller, nicht die Ansicht, Controller wird geladen (der präsentierte Controller).

+0

toll! Danke, Bladebunny. Wenn man diesen Code sieht, ist es offensichtlich ... –

+0

Ich war schon oft dort. Mach dich nicht fertig. Es ist ein großer Rahmen und sehr leicht zu übersehen. – Bladebunny

+5

Ich denke jedoch, es ist nützlich zu spezifizieren, dass es unmöglich ist, eine Aktion zu setzen, wenn backBarButtonItem anstelle von leftBarButtonItem ... –

3
UIButton * backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[backButton addTarget:self action:@selector(popViewController) forControlEvents:UIControlEventTouchUpInside]; 
[backButton setFrame:FRAME_DEFINE 
[backButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; 
[backButton setExclusiveTouch:YES]; 
[backButton setImage:[UIImage imageNamed:BACK_BUTTON_DEFAULT_ICON] forState:UIControlStateNormal]; 
[backButton setTitle:@"BACK" forState:UIControlStateNormal]; 
[backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
UIBarButtonItem *backMenuBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
self.navigationItem.leftBarButtonItem = backMenuBarButton; 
+0

Es ist ein Fehler, @ "ZURÜCK, aber Ihre Antwort hat mir geholfen. –

0

ich Code wie:

UIBarButtonItem *leftBar = [[UIBarButtonItem alloc] init]; 
leftBar.title = @"Back";//Details 
self.navigationController.navigationBar.topItem.backBarButtonItem = leftBar; 
0

Für Swift, Erzekiel Antwort als Grundlage für diese verwenden, können Sie es vereinfachen -

extension UIViewController { 

    func setBackButtonTitle(to title: String) { 
     let barButtonItem = UIBarButtonItem(title: title, style: .plain, target: self, action: nil) 
     self.navigationItem.backBarButtonItem = barButtonItem 
    } 
} 

Das von der Mutter aufgerufen werden soll Viewcontroller, zB in viewWillDisappear -

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    self.setBackButtonTitle(to: "Back")) 
} 
Verwandte Themen