Wie kann ich die Zurück-Zurück-Schaltfläche in iOS 7 und höher ohne Titel anpassen? (d. h. nur mit dem Pfeil)
self.navigationItem.leftBarButtonItem = self.editButtonItem;
Ich frage mich nur, ob sie self.backButtonItem haben.
ODER
etwas wie das?
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemBACK
target:self action:@selector(back)];
Es ist eigentlich ziemlich einfach, hier mache ich:
Ziel c
// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
Swift 2
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
Swift 3
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Setzen Sie diese Zeile in den View-Controller, der auf den Stack verschoben wird (den vorherigen View-Controller). Der neu gedrückte View-Controller-Zurück-Button zeigt jetzt alles an, was Sie für initWithTitle setzen, in diesem Fall eine leere Zeichenfolge.
Ich habe einen einfachen Weg gefunden, meinen hinteren Knopf mit iOS-Einzelpfeil zu machen.
Nehmen wir an, Sie haben einen Navigationscontroller, der von ViewB zu ViewA wechselt. Wählen Sie in IB die Navigationsleiste von ViewA aus. Sie sollten die folgenden Optionen sehen: Titel, Eingabeaufforderung und Schaltfläche "Zurück".
ViewA-Optionen für die Navigationsleiste
Der Trick besteht darin, in den Optionen von previous view controller (View A) den Schaltflächentitel des View-Controllers (ViewB) auszuwählen. Wenn Sie die Option "Zurück" nicht ausfüllen, wird der Titel "Zurück" von iOS automatisch mit dem Titel " previous view controller" eingefügt. Sie müssen diese Option also mit einem Leerzeichen füllen.
Leerzeichen in der Option "Zurück"
Das Ergebnis:
Verwenden Sie einfach ein Bild!
OBJ-C :
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
style:UIBarButtonItemStylePlain
target:self.navigationController
action:@selector(popViewControllerAnimated:)];
self.navigationItem.leftBarButtonItem = backButton;
}
Swift 4 :
let backBTN = UIBarButtonItem(image: UIImage(named: "Back"),
style: .plain,
target: navigationController,
action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self
Icon-Back.png
iOS7 hat neue Schnittstellenregeln, es ist also besser, den Zurückpfeil beizubehalten, wenn Sie eine UIView-Taste drücken. Fügen Sie einfach diesen Code vor Push the view hinzu (oder bereiten Sie ForSegue vor, wenn Sie StoryBoards verwenden):
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}
Dadurch wird der Standardtext "Zurück" geändert, der iOS 7-Pfeil bleibt jedoch hinterlegt. Sie können auch die Tönungsfarbe für den Rückwärtspfeil vor Push the view ändern:
- (void)viewDidLoad{
//NavBar background color:
self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}
Hoffe das hilft dir!
Sie müssen nicht viel tun. Sie können dasselbe durch das Storyboard selbst erreichen.
Gehen Sie einfach zum Root-Navigations-Controller und geben Sie ein Leerzeichen ein. Denken Sie nicht an den Controller, den Sie die Zurück-Schaltfläche ohne Titel haben wollten, sondern an den Root-Navigationscontroller.
Während Kyle Begemans Antwort den ganzen Trick vollbringt, ist es ziemlich ärgerlich, diesen Code in jedem View-Controller zu haben. Ich bekam eine einfache UINavigationItem
-Kategorie. Hüte dich, hier sei Drachen! Entschuldigung, ich meine, swizzling:
#import <objc/runtime.h>
@implementation UINavigationItem (ArrowBackButton)
static char kArrowBackButtonKey;
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
method_exchangeImplementations(m1, m2);
});
}
- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
if (item) {
return item;
}
item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
if (!item) {
item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return item;
}
@end
EDIT: 09.04.2014: Da ich Ansehen erlangt habe, tut es mir leid, dass ich diesen Trick nicht mehr benutze. Ich empfehle Kyles Antwort. Beachten Sie auch, dass die self
von self.navigationItem.backBarButtonItem
nicht der View-Controller ist, sondern die Zurück-Schaltfläche, aber der vorherige View-Controller, der zurückgesetzt werden soll.
Wenn Sie für den vorherigen View-Controller keinen Titeltext benötigen, füllen Sie den Titel einfach mit einer leeren Zeichenfolge.
self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];
Dies verhindert, dass "Chevron" auf dem Push-View-Controller angezeigt wird.
BEARBEITEN: Auch wenn Sie einen nicht leeren Titeltext verwenden, können Sie den Titel des vorherigen View-Controllers in viewWillAppear:
Works einstellen, es sei denn, der Titel kann blinken, wenn der View-Controller aufspringt. Ich denke, "The Twitter App" scheint einen subtileren Hack zu machen, um das Flimmern zu vermeiden.
Dies funktioniert, aber der Titel des vorherigen Elements wird entfernt, selbst wenn Sie dorthin zurückkehren:
self.navigationController.navigationBar.topItem.title = @"";
Setzen Sie diese Eigenschaft einfach auf viewDidLoad
des Push-View-Controllers.
So mache ich es und die einfachste, funktionierende und klarste Art, es zu tun.
Dies funktioniert, wenn in Navigation Controller
eingebettet wird.
Swift 3
In viewDidLoad
füge ich dies dem View Controller hinzu. Die Schaltfläche "Zurück" soll nur ein Pfeil sein.
if let topItem = self.navigationController?.navigationBar.topItem {
topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Der Unterschied zur Antwort von @Kyle Begeman besteht darin, dass Sie dies auf dem View-Controller aufrufen, bei dem die Schaltfläche "Zurück" nur Pfeil sein soll, und nicht auf dem Push-Stack-View-Controller.
Ein einfacher Hack von iOS6 funktioniert auch auf iOS7:
[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
Edit: Benutze diesen Hack nicht. Siehe Kommentar für Details.
Sie haben keinen Zugriff auf die Navigation backButtonItem, so wie Sie es möchten, und Sie müssen eine eigene Schaltfläche "Zurück" wie folgt erstellen:
- (void)loadView
{
[super loadView];
UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
[backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}
Und natürlich:
- (void) popVC{
[self.navigationController popViewControllerAnimated:YES];
}
Ziel: Anpassen aller Zurück-Schaltflächen in UINavigationBar
an ein weißes Symbol
Schritte: 1. in der Methode "didFinishLaunchingWithOptions" von AppDelete :
UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
[UINavigationBar appearance].tintColor = [UIColor whiteColor];
[UINavigationBar appearance].backIndicatorImage = backBtnIcon;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{
UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}
2. in der viewDidLoad
-Methode der allgemeinen Superklasse ViewController
:
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
style:UIBarButtonItemStylePlain
target:nil
action:nil];
[self.navigationItem setBackBarButtonItem:backItem];
}else{
//do nothing
}
Alle Antworten lösen das Problem nicht. Es ist nicht akzeptabel, den Schaltflächentitel in jedem Ansichts-Controller zurückzusetzen. Durch das Hinzufügen des Versatzes zum Titel wird der nächste Titel des View Controller nach rechts verschoben.
Hier ist die Methode, die die Methode swizzling verwendet. Erstellen Sie einfach eine neue Erweiterung für UINavigationItem
import UIKit
extension UINavigationItem {
public override class func initialize() {
struct Static {
static var token: dispatch_once_t = 0
}
// make sure this isn't a subclass
if self !== UINavigationItem.self {
return
}
dispatch_once(&Static.token) {
let originalSelector = Selector("backBarButtonItem")
let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)
let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
// MARK: - Method Swizzling
struct AssociatedKeys {
static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}
func noTitleBackBarButtonItem() -> UIBarButtonItem? {
if let item = self.noTitleBackBarButtonItem() {
return item
}
if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
return item
} else {
let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return newItem
}
}
}
sie können dies verwenden. Dies funktioniert perfekt für mich, indem Sie einfach eine UIButton
als custumview für die UIBarButtonItem
hinzufügen.
Probieren Sie den folgenden Code aus
self.navigationItem.leftBarButtonItem=[self backButton];
- (UIBarButtonItem *)backButton
{
UIImage *image = [UIImage imageNamed:@"back-btn.png"];
CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);
UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
[button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
[button setImage:image forState:UIControlStateNormal];
UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];
return item;
}
// add left bar button item
try this code:
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
CGRect backframe = CGRectMake(250, 9, 15,21);
UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
[backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
[backbutton addTarget:self action:@selector(Btn_back:)
forControlEvents:UIControlEventTouchUpInside];
[backbutton setShowsTouchWhenHighlighted:YES];
UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
self.navigationItem.leftBarButtonItem=backbarbutton;
[backbutton release];
}
-(IBAction)Btn_back:(id)sender
{
[self.navigationController popViewControllerAnimated:YES];
}
Sie können UINavigationController als Unterklasse definieren, sich selbst als Delegat festlegen und das backBarButtonItem in der Delegatmethode navigationController:willShowViewController:animated:
festlegen.
@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>
@end
@implementation Custom_NavigationController
- (void)viewDidLoad
{
[super viewDidLoad];
self.delegate = self;
}
#pragma mark - UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
Titel zurückstellen
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];
Bild zurück ändern
UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;
Erstellen Sie eine UILabel
mit dem gewünschten Titel für Ihren Root-View-Controller und weisen Sie ihn dem navigationItem.titleView
des View-Controllers zu.
Setzen Sie nun den Titel auf eine leere Zeichenfolge, und der nächste View-Controller, den Sie drücken, hat eine Schaltfläche ohne Text.
self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";
Der einzige Weg, der für mich funktionierte, war:
navigationController?.navigationBar.backItem?.title = ""
AKTUALISIEREN:
Als ich die Segue-Animationsflagge auf true geändert hatte (vorher war es falsch), funktionierte der einzige Weg für mich:
navigationController?.navigationBar.topItem?.title = ""
Wenn Sie über zwei ViewController (FirstVC, SecondVC) verfügen, die in den Navigations-Controller eingebettet sind, und Sie möchten, gibt es in SecondVC nur einen hinteren Pfeil.
Sie können dies versuchenIn FirstVCs ViewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}
Wenn Sie dann in SecondVC drücken, sehen Sie, dass es nur einen hinteren Pfeil gibt
Ich verwende diese Lösung seit iOS 5 oder so ohne Probleme. Ich habe eine Utility-Funktion erstellt, die ich in meinen View-Controllern aufrufe. Sie müssen dies entweder in viewDidLoad oder an einem anderen Punkt tun.
void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
if(! viewController.navigationItem.backBarButtonItem)
{
viewController.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:text
style:UIBarButtonItemStylePlain
target:nil action:nil];
}
else
{
viewController.navigationItem.backBarButtonItem.title = text;
}
}
In einigen Fällen ist das Navigationselement möglicherweise bereits vorhanden, in anderen Fällen muss es erstellt werden. Dies berücksichtigt beide Fälle, ohne den Titel des Navigationselements zu beeinträchtigen. Sie können den Titel entfernen, indem Sie einfach @""
übergeben.
Ich habe den folgenden Code in viewDidLoad angewendet und es funktioniert:
// this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";
// this line set the back button and default icon color
//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];
this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];
Zum Aktualisieren verwende ich Vector Icon
Swift 4
Für Benutzer, die eigene Rückwand-Schaltflächen erstellen und deren Titel entfernen möchten, verwenden Sie bitte den folgenden Code innerhalb des View-Controllers, der den neuen drückt:
self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Für eine universellere Verwendung gehen Sie wie folgt vor:
Erstellen Sie eine universelle Funktion wie folgt:
func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Dann verwenden Sie es in den View-Controllern wie folgt:
addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
Überprüfen Sie diese Antwort
Wie ändere ich den Namen der UINavigationController-Schaltfläche?
setzen Sie title
text mit einem Leerzeichen wie folgt auf string
title = " "
Du hast nicht genug Ruf, um Kommentare hinzuzufügen :)
Wenn Sie die Farbtönungsfarbe der Navigationsleiste festlegen, fügen Sie ein benutzerdefiniertes Bild für die hintere Schaltfläche ohne Titel hinzu, dessen Farbton die Bildfarbe widerspiegelt. Bitte folgen Sie diesem Apple-Dokumentationslink.
UINavigationItem *navItem = [[UINavigationItem alloc] init];
navBar.tintColor = self.tintColor;
UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
myImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
navItem.leftBarButtonItem = leftButton;
navBar.items = @[ navItem ];
Sie können diese Kategorie in der AppDelegate.m-Datei . Ablegen, um sie zu entfernen text von allen Standard-Zurück-Schaltflächen in UINavigation. Nur der Pfeil "<" oder ein benutzerdefiniertes Bild festlegen, falls erforderlich.
Ziel c:
...
@Ende
@implementation UINavigationItem (Erweiterung) - (UIBarButtonItem *) backBarButtonItem { return [[UIBarButtonItem alloc] initWithTitle: @ "" Stil: UIBarButtonItemStylePlain Ziel: keine Aktion: keine]]...
Sie können den Titel des aktuellen ViewControllers in viewWillDisappear in @ "" ändern. Wenn der Titel wieder angezeigt wird, setzen Sie den Titel auf den vorherigen Wert zurück.
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.title = @"Previous Title";
}
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.title = @"";
}
In der prepareForSegue: -Methode Ihres ersten ViewControllers legen Sie den Titel der Ansicht auf @ "" fest. Wenn die nächste Ansicht gedrückt wird, wird der vorherige ViewController-Titel angezeigt.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
self.navigationItem.title = @" ";
}
Das einzige Problem dabei ist, dass Ihre vorherige Ansicht keinen Titel hat, wenn Sie auf die Zurück-Schaltfläche tippen. Sie können ihn also erneut in viewWillAppear hinzufügen:
-(void)viewWillAppear:(BOOL)animated{
self.navigationItem.title = @"First View Title";
}
Ich mag diese Lösung nicht sehr, aber sie funktioniert und ich habe keinen anderen Weg gefunden.
Um die Antwort von Thomas C oben hinzuzufügen, funktioniert das Platzieren eines einzelnen Leerzeichens manchmal nicht und Sie müssen ständig Leerzeichen hinzufügen.
Sie wissen, dass Sie erfolgreich waren, wenn Sie unter "Navigationselement" "Bar Button Item -" sehen. Das ist in der Dokumentgliederung (Editor-> Dokumentgliederung anzeigen). Sobald Sie das obige Bild sehen, können Sie einige Leerzeichen löschen und sehen, ob es noch funktioniert.
Ich habe eine Erweiterung geschrieben, um das zu erleichtern:
extension UIViewController {
/// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
@objc var backButtonTitle: String? {
get {
return navigationItem.backBarButtonItem?.title
}
set {
if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
existingBackBarButtonItem.title = newValue
}
else {
let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
navigationItem.backBarButtonItem = newNavigationItem
}
}
}
}
Setzen Sie den Titel des Schaltflächenelements als leeren String zurück.
[self.navigationController.navigationBar.backItem setTitle: @ ""];
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Custom initialization
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
return self;
}
Genau wie Kyle Begeman fügen Sie den Code oben in Ihrem Root-View-Controller hinzu. Alle Untersicht-Controller werden angewendet. Durch Hinzufügen dieser Methode in der Methode initWithCoder: können Sie außerdem den Stil für Root-Ansicht-Controller in Xib-, Storyboard- oder codebasierten Ansätzen anwenden.
Ich ändere den Ansichtstitel, wenn er verschwindet
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
title = "My title"
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
title = " "
}