it-swarm.com.de

Den Titeltext eines iOS-UIBarButtonItem entfernen

Ich wollte den Text von der "Zurück" -Schaltfläche einer UIBarButtonItem entfernen und nur den blauen Chevron in der Navigationsleiste belassen. Denken Sie daran, dass ich für iOS 7 entwickle. Ich habe mehrere Methoden ausprobiert, unter anderem:

Dies ist die Bildmethode, die ich nicht mochte (das Bild sah falsch aus):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

Eine andere Methode, die ich ausprobierte, war diese, die einfach nicht funktionierte (es wurde nichts angezeigt):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
[email protected]"";
self.navigationItem.leftBarButtonItem=barBtn;

Was ich erreichen wollte, ist so etwas wie die hinteren Knöpfe in der iOS 7 Music App, die nur einen einzigen Chevron enthielt. 

Vielen Dank.

194
Pan Ziyue
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

Dann können Sie den Titel der Rückentaste entfernen. 

Wenn Sie das Storyboard verwenden, können Sie den Zurück-Button der Navigationsattribute mit Leerzeichen festlegen. 

200
andyleehao

So legen Sie den Titel der Rückschaltfläche für einen View-Controller fest, ohne den Titel zu ändern:

Ziel c:

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

Schnell:

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Um es klar zu sagen, geschieht dies auf dem View-Controller, den Sie sehen würden, wenn Sie die Zurück-Taste drücken. d. Anstatt '<Settings' zu sehen, möchten Sie nur '<' sehen, dann würden Sie dies auf Ihrem SettingsViewController in Ihre init einfügen. Wenn der View-Controller selbst betrachtet wird, werden keine Probleme mit dem Titel angezeigt. 

406
DonnaLea

Wenn Sie Storyboards verwenden, können Sie Attributes Inspector des Navigation Item des ViewControllers aufrufen (klicken Sie auf Navigation Bar) und setzen Sie die Back Button-Eigenschaft auf "" (ein Leerzeichen). Dadurch wird der Titel des Zurück-Buttons auf ein Leerzeichen gesetzt, und der Chevron bleibt sichtbar. Keine Notwendigkeit, sich mit Code anzulegen.

example image

Beachten Sie, dass hier Back Button title für die Zurück-Schaltfläche festgelegt wird, die zu diesem View Controller wechselt von der oben gedrückten Taste, nicht für den Back Button, der in diesem Controller angezeigt wird!

126

Dies funktioniert für mich, um nur den "hinteren" Chevron ohne Text anzuzeigen:

self.navigationController.navigationBar.topItem.title = @"";

Setzen Sie diese Eigenschaft in viewDidLoad des View Controllers, der die Navigationsleiste darstellt, und der Trick wird ausgeführt.

Hinweis: Ich habe es nur in iOS 7 getestet, was im Rahmen der Frage liegt.

122
Guto Araujo

Wenn Sie den Titel der Schaltfläche festlegen, verwenden Sie @ "" anstelle von @ "".

--BEARBEITEN--

Ändert sich etwas, wenn Sie andere Saiten ausprobieren? Ich verwende den folgenden Code selbst erfolgreich:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString ist eine Variable, die auf @ "" oder @ "Back" gesetzt ist, abhängig davon, ob ich auf iOS 7 oder einer niedrigeren Version bin.

Zu beachten ist, dass dieser Code nicht im Controller der Seite enthalten ist, für die ich die Zurück-Schaltfläche anpassen möchte. Es befindet sich tatsächlich im Controller vor dem Navigationsstapel.

27
Kamaros

 enter image description here

Manchmal ist es hilfreich, die Dinge im Kontext zu sehen. Hier ist ein Minimalprojekt, das den "zurück" -Text verbirgt, aber immer noch den Pfeil zeigt.

Storyboard

 enter image description here

Es gibt einen Show-Übergang von der Schaltfläche "Show Second View Controller" zum zweiten View Controller. 

Ich habe auch ein Navigationselement zum zweiten View-Controller hinzugefügt, damit es einen Titel hat. Dies ist optional. Es hat keinen Einfluss auf die Zurück-Taste.

Code

FirstViewController.Swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewController.Swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

Alternative Methode (nur IB, kein Code)

Wählen Sie im Storyboard das Navigationselement für den Ansichts-Controller first (nicht den zweiten). Geben Sie einfach ein Leerzeichen für den Text der Schaltfläche "Zurück" ein.

 enter image description here

26
Suragch
self.navigationController.navigationBar.topItem.title = @"";
15
Claudio Castro

Unter iOS7 hat Apple zwei neue Eigenschaften für UINavigationBar eingeführt, "backIndicatorTransitionMaskImage" und "backIndicatorImage".

Einfach einmal anrufen:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

Es wird ein benutzerdefiniertes Bild anstelle der standardmäßigen Chevron-Glyphe gerendert, wodurch die Farbtonfarbe von keyWindow übernommen wird.

Und um den Titel zu entfernen, schlage ich die Antwort von Kamaros vor. Denken Sie daran, diesen Code auf dem View-Controller aufzurufen, der Ihren neuen View-Controller durchführt. Den Titeltext eines iOS-UIBarButtonItem entfernen

11
DZenBot

Das hat für mich in iOS10 funktioniert. Rufen Sie dies über viewDidLoad des View-Controllers auf.

self.navigationController?.navigationBar.topItem?.title = ""
10
Ravi

Ich hatte mit den bereitgestellten Antworten nicht viel Erfolg, fand aber eine wirklich einfache Lösung. In Ihrem Storyboard können Sie auf das Navigationselement Ihres UIViewControllers klicken und den Text für die Schaltfläche "Zurück" festlegen. Ich stellte es auf ein einzelnes "" Feld ein und gab mir das Verhalten, nach dem ich suchte.enter image description here

10
Grahambo

Eine einfache Lösung für dieses Problem, die sowohl unter iOS7 als auch unter 6 funktioniert, besteht darin, die benutzerdefinierte Titelansicht in viewDidLoad festzulegen:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

Dann in viewWillAppear: Sie können sicher anrufen

self.navigationController.navigationBar.topItem.title = @" ";

Da Ihre Titelansicht eine benutzerdefinierte Ansicht ist, wird sie nicht überschrieben, wenn Sie sich wieder im Navigationsstapel befinden.

6
Matthes

Eigentlich können Sie dies mit nur einem Trick tun: 

Überschreiben Sie die UINavigationBar-Klasse und fügen Sie diese Codezeile hinzu:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

Dann initialisieren Sie UINavigationController mit dieser benutzerdefinierten UINavigationBar-Klasse. Usw. UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

Hoffe das hilft

6
rordulu

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.

5

Mit der Antwort von DonnaLea konnte ich etwas zusammenbasteln. So erscheint die Lösung in meiner UIViewController-Unterklasse:

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

Das Problem mit der ursprünglichen Antwort ist, dass der Titel vom Controller entfernt wird, wenn Sie ihn wieder aufrufen. Der Versuch, den Titel in viewWillDisappear zurückzusetzen, ist im Übergangsprozess zu spät. Dadurch rastet der Titel ein, statt ihn schön zu animieren. Der willMoveToParentViewController geschieht jedoch früher und ermöglicht das korrekte Verhalten.

Vorbehalt: Ich habe dies nur mit einem normalen UINavigationController Push/Pop getestet. In anderen Situationen kann zusätzliches unerwartetes Verhalten auftreten.

4
BradB

Keine der Antworten hat mir geholfen. Aber ein Trick tat es - ich habe gerade den Titel des View-Controllers gelöscht, der gedrückt hat (wo der hintere Knopf ist), bevor er gedrückt wurde.

Wenn also in der vorherigen Ansicht kein Titel vorhanden ist, hat die Zurück-Schaltfläche unter iOS 7 nur einen Pfeil ohne Text.

Auf viewWillAppear der Pushing-Ansicht habe ich den Originaltitel zurückgesetzt.

3
Kof

Dies ist die Unterklasse navigationController, die das "Zurück" entfernt.

Ich verwende es, um es dauerhaft über die App zu entfernen.

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                                       style:UIBarButtonItemStylePlain
                                                                                      target:nil
                                                                                      action:nil];
}

@end
3
0yeoj

Swift 3

navigationController?.navigationBar.topItem?.title = ""
3
Jiří Zahálka
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];
3
Bill Xie
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

Ich hatte das gleiche Problem und habe es so gemacht. 

--BEARBEITEN--

dies ist eine Lösung, wenn Sie den Titeltext aller UIBarbuttonItem wirklich entfernen möchten. Wenn Sie nur den Titel der Schaltfläche für die hintere Leiste entfernen möchten, gibt es keine einfache und bequeme Lösung. In meinem Fall habe ich, da ich nur wenige UIBarButtonItems habe, die Titeltext anzeigen müssen, gerade die titleTextAttributes dieser Schaltflächen geändert. Wenn Sie genauer sein möchten, verwenden Sie den folgenden Code, der nur die Schaltflächen der Navigationsleiste ändert:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];
3
andylee

Titel der Navigationsleiste ausblenden

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;
2
Kirit Vaghela

Hier ist was ich mache, was einfacher ist, den Titel des Zurück-Buttons zu entfernen

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}
2
YannickSteph

Das ist eine bessere Lösung.

Andere Lösung ist gefährlich, weil es Hack ist.

extension UINavigationController {

    func pushViewControllerWithoutBackButtonTitle(_ viewController: UIViewController, animated: Bool = true) {
        viewControllers.last?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        pushViewController(viewController, animated: animated)
    }
}
1
taku_oka

Sie können dies auch verwenden:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

Das funktioniert für mich

1
Utkarsh 786

Ich erstelle eine benutzerdefinierte Klasse für UINavigationController und wende sie auf alle Navigationssteuerungen in meiner App an. Innerhalb dieser benutzerdefinierten UINavigationController-Klasse habe ich den UINavigationBar-Delegaten auf self gesetzt, sobald die Ansicht geladen wird.

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

Dann implementiere ich die Delegat-Methode:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

Auf diese Weise ordne ich einfach meine benutzerdefinierte Klasse allen Navigationssteuerungen zu und löscht den Titel von allen hinteren Schaltflächen. Der Klarheit halber stelle ich den Titel für alle anderen View-Controller in viewWillAppear immer so ein, dass der Titel immer unmittelbar vor dem Anzeigen der Ansicht aktualisiert wird (falls er durch solche Tricks entfernt wird).

1
nurider

Wenn Sie wie ich eine benutzerdefinierte Ansicht anstelle der UINavigationBar verwenden und mit der Zurück-Taste stecken bleiben, müssen Sie ein bisschen Arbeit machen, die sich etwas unangenehm anfühlt. 

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

Es scheint, als würde es nicht präsentiert werden, egal was es versucht, einen Titel zu zeigen. Dies bedeutet, dass der Titel ausgeblendet wird, bevor er gezeichnet wird, und das Problem gelöst wird.

1
Nicholas Smith
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}
1
Maor

Swift 3.1 Dies kann durch Implementierung der Delegat-Methode von UINavigationController erreicht werden. Es wird nur die Schaltfläche mit dem Titel "Zurück" ausgeblendet. Wir erhalten weiterhin das Bild mit dem Pfeil nach hinten und die Standardfunktionen.

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }

Perfekte Lösung weltweit

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

    return true
}
1
PeiweiChen
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }
1
A.G

Ich habe eine sehr einfache Zero-Config-Kategorie erstellt, um alle Back-Button-Titel in unserer App auszublenden. Sie können sie sich ansehen hier . Diese Frage wurde bereits beantwortet, kann aber für andere hilfreich sein.

EDIT:

.h Datei

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

M-Datei

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
0
Pratik Jamariya

Ich konnte es nicht mit Guto Araujos Antwort von navigationBar.topItem.title = @""; zum Laufen bringen.

Ich konnte jedoch den gewünschten Effekt erzielen, indem Sie self.title = @"" in der init-Methode meines View-Controllers festlegen. (Die Einstellung in init ist wichtig, viewDidLoad funktioniert nicht.)

0
zekel

Ich liste die Lösungen auf, die bisher für mich gearbeitet haben.

override func viewDidLoad() {
super.viewDidLoad()   



self.navigationController?.navigationBar.topItem?.title = "" // 1

 let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)  // 2

UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal) //3

UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted) //4   



}
0
A.G

Wenn Sie nur ein einzelnes Feld für den Navigationsknopf "Zurück" eingeben, funktioniert dies!

0
VirajP

Wenn Sie den Titel der hinteren Schaltfläche in iOS11 entfernen möchten, können Sie es versuchen! 

@implementation UIView (PrivateBackButton)

    + (void)initialize {
        if ([NSProcessInfo processInfo].operatingSystemVersion.majorVersion < 11.0) return;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            [NSObject hookInstanceMethodForClass:[self class] originalMethod:@selector(layoutSubviews) newMethod:@selector(mc_layoutSubviews)];
        });
    }

    - (void)mc_layoutSubviews {
        [self mc_layoutSubviews];
        [self updateiOS11LaterUI];
    }

    - (void)updateiOS11LaterUI {
        if ([NSProcessInfo processInfo].operatingSystemVersion.majorVersion < 11.0) return;
        if (![self isKindOfClass:NSClassFromString(@"_UIBackButtonContainerView")]) return;

        [self removeAllSubviews];
        [self.superview mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.width.mas_equalTo(@44);
        }];
    }

    @end
0
l1Dan

In iOS 11 können Sie den nächsten Code verwenden, um den Schaltflächentitel auszublenden:

Swift:

UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([ NSForegroundColorAttributeName : UIColor.clear ], for: .highlighted)

Dieser Code entfernt den Titel nicht aus der Navigationsleiste, sondern macht ihn nur transparent. Wenn Sie mehr Platz für den View Controller-Titel benötigen, müssen Sie eine andere Lösung verwenden.

0
Serhiy

Implementieren Sie Ihre eigene UIViewController-Basisklasse und überschreiben Sie setTitle:.

@interface CustomViewController : UIViewController
@end

@implementation CustomViewController

- (void)setTitle:(NSString *)title {
    super.title = @""; // This will remove the "Back" title
    UILabel *titleView = [UILabel new];
    // customize the label as you wish
    titleView.text = title;
    [titleView sizeToFit];
    self.navigationItem.titleView = titleView;
}

@end

Jetzt können Sie in jeder UIViewController, wo Sie den Titel setzen möchten, einfach self.title = @"MyTitle" wie gewohnt schreiben. Wenn Sie eine neue UIViewController drücken, wird kein Text in der hinteren Leiste angezeigt.

0
Avi