Comment masquer le texte du bouton Précédent à un contrôleur UINavigation? .__ Je n'aurai que le "<" et pas "<Retour"
Dans le générateur d'interface , vous pouvez sélectionner l'élément de navigation du contrôleur précédent et remplacer la chaîne Back Button
par le nom du bouton Précédent. Si vous voulez le laisser vide, par exemple, mettez juste un espace.
Vous pouvez aussi le changer avec cette ligne de code:
[self.navigationItem.backBarButtonItem setTitle:@"Title here"];
Ou dans Swift :
self.navigationItem.backBarButtonItem?.title = ""
Vous pouvez également le faire via le storyboard. Dans l'inspecteur d'attributs de l'élément de navigation du contrôleur précédent , vous pouvez définir "" dans le champ du bouton Précédent. Voir l'image ci-dessous. Remplacez "Votre titre ici" par "". En faisant cela, vous obtiendrez le résultat souhaité. Vous n'avez plus besoin de jouer avec le "Titre".
Par programme, vous pouvez utiliser
[self.navigationItem.backBarButtonItem setTitle:@" "];
où self fait référence au contrôleur qui pousse le contrôleur View souhaité.
Échantillon avant, après la barre de navigation
Avant
Après
Vous pouvez implémenter UINavigationControllerDelegate comme ceci:
vieux Swift
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
Swift 4.x
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
}
backBarButtonItem est nil par défaut et affecte le prochain contrôleur poussé. Vous devez donc le définir pour tous les contrôleurs.
La définition du titre du bouton de retour sur @""
ou nil
ne fonctionnera pas. Vous devez définir le bouton entier vide (sans titre ni image):
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]];
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Cela devrait être fait sur le contrôleur de vue qui se trouve au-dessus de votre contrôleur de vue dans la pile de navigation (c'est-à-dire depuis lequel vous accédez à votre VC via la méthode pushViewController
)
Une autre solution à ce problème dans les situations où vous avez beaucoup de contrôleurs de vue consiste à utiliser un proxy UIAppearance
pour masquer efficacement le texte du titre du bouton Précédent, comme ceci:
UIBarButtonItem *navBarButtonAppearance = [UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil];
[navBarButtonAppearance setTitleTextAttributes:@{
NSFontAttributeName: [UIFont systemFontOfSize:0.1],
NSForegroundColorAttributeName: [UIColor clearColor] }
forState:UIControlStateNormal];
Cette solution rendra le texte sous forme de minuscule point clair, similaire à la définition manuelle du titre du bouton précédent sur @" "
, à la différence qu'il affecte tous les boutons de la barre de navigation.
Je ne suggère pas cela comme une solution générale au problème, car cela concerne tous les boutons de la barre de navigation. Il renverse le paradigme pour que vous choisissiez quand afficher les titres de bouton, plutôt que quand masquer les titres.
Pour choisir quand afficher les titres, restaurez manuellement les attributs de texte de titre selon vos besoins ou créez une sous-classe spécialisée de UIBarButtonItem
faisant la même chose (éventuellement avec un autre proxy UIAppearance
.).
Si vous avez une application dans laquelle la plupart des titres des boutons de retour doivent être masqués et que seuls quelques-uns (ou aucun) des boutons de navigation sont des boutons système avec des titres, cela pourrait être pour vous!
(Remarque: le changement de taille de la police est nécessaire même si la couleur du texte est claire afin de garantir que les titres longs ne provoquent pas le déplacement du titre central de la barre de navigation).
Ajoutez le code suivant dans viewDidLoad ou loadView
self.navigationController.navigationBar.topItem.title = @"";
Je l'ai testé sur iPhone et iPad avec iOS 9
Vous pouvez ajouter cette catégorie Objective-C pour que tous les boutons "Précédent" créés par un contrôleur de navigation n'aient pas de texte. Je viens de l'ajouter à mon fichier AppDelegate.m.
@implementation UINavigationItem (Customization)
/**
Removes text from all default back buttons so only the arrow or custom image shows up.
*/
-(UIBarButtonItem *)backBarButtonItem
{
return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}
@end
PS - (Je ne savais pas comment faire fonctionner cette extension avec Swift, c’était des erreurs étranges. Les modifications sont bienvenues pour ajouter une version de Swift)
pour supprimer le texte du bouton arrière par programme, utilisé ci-dessous Code cela fonctionnera sous la forme xcode7 et au-dessus.
self.navigationController.navigationBar.topItem.title = @ "";
ou
manuellement Dans les storyboards, sélectionnez la barre de navigation sur le contrôleur de vue et mettez "" dans le texte du bouton Précédent.
cela fonctionnera. Merci
La seule chose qui fonctionne sans effets secondaires est de créer un bouton de retour personnalisé. Tant que vous ne fournissez pas d'action personnalisée, même le geste de la diapositive fonctionne.
extension UIViewController {
func setupBackButton() {
let customBackButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = customBackButton
}}
Malheureusement, si vous souhaitez que tous les boutons Précédent ne contiennent aucun titre, vous devez configurer ce bouton Retour personnalisé dans tous vos contrôleurs de vue:
override func viewDidLoad() {
super.viewDidLoad()
setupBackButton()
}
Il est très important de définir un espace comme titre et non une chaîne vide.
La réponse actuelle ne fonctionnait pas. Je voulais supprimer le titre entièrement, mais le texte "retour" ne disparaissait pas.
Retournez au contrôleur de vue précédent et définissez sa propriété title:
self.title = @" ";
ONLY fonctionne lorsque le précédent View Controller n'a pas de titre
Autre moyen - utilisez la classe personnalisée NavigationBar.
class NavigationBar: UINavigationBar {
var hideBackItem = true
private let emptyTitle = ""
override func layoutSubviews() {
if let `topItem` = topItem,
topItem.backBarButtonItem?.title != emptyTitle,
hideBackItem {
topItem.backBarButtonItem = UIBarButtonItem(title: emptyTitle, style: .plain, target: nil, action: nil)
}
super.layoutSubviews()
}
}
C’est-à-dire que cela supprime les titres de tout le projet . Il suffit de définir une classe personnalisée pour UINavigationController.
Définissez le titre de la chaîne VC précédente sur "" avec espace. et le titre avec le bouton de retour sera remplacé par une chaîne d’espace unique.
Self.title = " "
Au retour, appuyez à nouveau sur le titre pour le remettre dans son affichage d'origine.
Utilisez une NavigationController
personnalisée qui remplace pushViewController
class NavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem =
UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
super.pushViewController(viewController, animated: animated)
}
}
Beaucoup de réponses déjà, voici mes deux cents sur le sujet. J'ai trouvé cette approche très robuste. Vous avez juste besoin de mettre ceci dans viewController avant segue.
Swift 4:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
J'ai essayé certains ci-dessus mais ils n'ont pas fonctionné. Cela a fonctionné pour moi:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.topItem?.title = ""
}
Swift 3.1 Vous pouvez le faire en implémentant la méthode déléguée de UINavigationController.
func navigationController(_ navigationController: UINavigationController,
willShow viewController: UIViewController, animated: Bool) {
/** It'll hide the Title with back button only,
** we'll still get the back arrow image and default functionality.
*/
let item = UIBarButtonItem(title: " ", style: .plain, target: nil,
action: nil)
viewController.navigationItem.backBarButtonItem = item
}
J'ai tout essayé dans ce post. La seule solution qui fonctionne est @ VoidLess's
Voici la même réponse mais plus complète
class CustomNavigationController: UINavigationController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.delegate = self
}
}
// MARK:UINavigationControllerDelegate
extension CustomNavigationController {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
}
Dans Swift3,
Si vous définissez un paramètre global
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// ..
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted)
// ...
}
Ceci est ma résolution pour iOS11, je modifie l'apparence de UIBarButtonItem dans applicationDidFinishLaunchingWithOptions:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-100, 0), for:UIBarMetrics.default)
Vous ne pouvez pas modifier le décalage en Y, car cela modifiera également la position du bouton de barre arrière dans iOS11, mais c'est OK dans iOS10 et les versions antérieures.
Pour ceux qui veulent masquer le titre du bouton de manière globale.
Vous pouvez balayer viewDidLoad
de UIViewController
comme ceci.
+ (void)overrideBackButtonTitle {
NSError *error;
// I use `Aspects` for easier swizzling.
[UIViewController aspect_hookSelector:@selector(viewDidLoad)
withOptions:AspectPositionBefore
usingBlock:^(id<AspectInfo> aspectInfo)
{
UIViewController *vc = (UIViewController *)aspectInfo.instance;
// Check whether this class is my app's view controller or not.
// We don't want to override this for Apple's view controllers,
// or view controllers from external framework.
NSString *className = NSStringFromClass([vc class]);
Class class = [NSBundle.mainBundle classNamed:className];
if (!class) {
return;
}
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
vc.navigationItem.backBarButtonItem = backButton;
} error:&error];
if (error) {
NSLog(@"%s error: %@", __FUNCTION__, error.localizedDescription);
}
}
Usage:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[self class] overrideBackButtonTitle];
return YES;
}
Enfin trouvé la solution idéale pour masquer le texte de retour par défaut dans toute l'application.
Ajoutez simplement une image transparente et ajoutez le code suivant dans votre AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Ma solution: - XCode: 10.2.1 - Swift: 5
Je me débattais avec ceci car j'avais un contrôleur de navigation personnalisé . J'ai pu supprimer le texte de l'élément arrière dans tous les contrôleurs de vue avec ce code dans ma classe de contrôleur de navigation personnalisé override func viewDidLayoutSubviews() {
self.navigationBar.backItem?.title = ""
}
Cela supprime tous les titres d'élément précédent à l'aide de ce contrôleur de navigation personnalisé.
Le texte de retour provenant de navigationItem.title
, et navigationItem.title
du contrôleur de vue précédent est automatiquement défini par self.title
. Le moyen le plus simple de résoudre le problème est le hook setTitle:
, assurez-vous que navigationItem.title = @""
Mettez ce code à AppDelegate.m
ça ira。
[UIViewController aspect_hookSelector:@selector(setTitle:)
withOptions:AspectPositionAfter
usingBlock:^(id<AspectInfo> aspectInfo, NSString *title) {
UIViewController *vc = aspectInfo.instance;
vc.navigationItem.titleView = ({
UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
titleLabel.text = title;
titleLabel;
});
vc.navigationItem.title = @"";
} error:NULL];
Plus de détails sur https://www.jianshu.com/p/071bc50f1475 (Simple Chinease
-(void)setNavigationItems{
UIBarButtonItem *leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"**Your title here**" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonClicked)];
self.navigationController.navigationBar.topItem.backBarButtonItem=leftBarButtonItem;
}
-(void)backButtonClicked{
[self.navigationController popViewControllerAnimated:YES];
}