İOS UIBarButtonItem'in başlık metnini kaldırma


198

Yapmak istediğim şey, a'nın 'Geri' düğmesindeki metni kaldırmak UIBarButtonItemve gezinme çubuğunda yalnızca mavi köşeli çift ayraç bırakmak. İOS 7 için geliştirdiğimi unutmayın: Bunlarla sınırlı olmamak üzere aşağıdakileri içeren çeşitli yöntemler denedim:

Bu sevmediğim görüntü yöntemidir (görüntü yerinden çıkmıştı):

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

Denediğim başka bir yöntem, sadece işe yaramadı (hiçbir şey görüntülenmedi):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

Elde etmek istediğim, sadece tek bir chevron içeren iOS 7 Müzik uygulamasında bulunan geri düğmeleri gibi bir şey.

Teşekkürler.



Neden gereksiniminizin ne olduğunu görmüyorsunuz? Ve leftBarButtonItem içinde bakın.
Vishal Sharma

Resim yöntemini kullanmamamın nedeni 1'dir. Geri düğmesinin mükemmel bir resmini elde etmek çok zor ve 2. Görüntüyle bir tür yanlış hizalama olacak ve doğal görünmüyor ve bu yüzden Bunu yerel olarak nasıl yapacağım konusunda yardım almak için StackOverflow'a gittim.
Pan Ziyue

Yanıtlar:


198
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

Ardından geri düğmesi öğesi başlığını kaldırabilirsiniz.

Storyboard kullanıyorsanız, navigasyon nitelikleri denetçisi Geri Düğmesini boşlukla ayarlayabilirsiniz.


95
Büyük başlıklarla ilgili bir sorun var: ortalanmış değiller, ancak geri düğme metni hala oradaymış gibi sağa doğru itiliyorlar
sonxurxo

11
Kullanıcı "Erişilebilirlik - Düğme şekilleri" seçeneğini
Mikael Bartlett

22
Bence bu daha iyi bir cevap:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
benjamin

19
İçinde sihirli sayılar bulunan herhangi bir çözüm kötü bir fikirdir. Otomatik düzene itme ile, boyut sınıfları, erişilebilirlik özellikleri vb. Bunun gibi sabit değerleri kullanmak sizi ısırmaya bağlıdır.
Michael Peterson

3
Benjamin'in yorumun geliştirmek için, bu belirlesin UIControlStateHighlightedyanı
n_b

411

Bir görünüm denetleyicisinin başlığını değiştirmeden geri düğmesi başlığını ayarlamak için şunu kullanın:

Objective-C:

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

Swift:

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

Açıkça söylemek gerekirse, bu, geri düğmesine basıp basmadığınızı göreceğiniz görünüm denetleyicisinde yapılır. yani yerine SettingsViewController daha sonra '<Ayarlar' Sadece görmek istiyorum '<' görme aşağıdaki konularda olarak vereceğini init. Ardından, görünüm denetleyicisinin kendisine baktığınızda başlığın gösterilmemesi sorunlarından hiçbirini alamazsınız.


1
Diğer cevabın neden doğru olarak işaretlendiğini bilmiyorum, sadece geri düğmesinin doent'ı göstermek için bir "başlığa" sahip olduğu için başlığı kaldırıyor, ama bu doğru yaklaşım değil! Bu doğru cevap olmalı.
Pach

8
Ayrıca Swift kullanan herkes için, bu navigationItem.backBarButtonItem = UIBarButtonItem (title: "", stil: .Plain, target: nil, action: nil). Obj-C'den Swift'e dönüştürmek zor değil, ama size
beladan

15
@BenjaminPiette bunu UIViewController'da geri düğmesine bastığınızda göreceğinizi mi görüyorsunuz? Geri düğmesini görüntüleyen UIViewController değil.
DonnaLea

2
Ne kadar zarif bir çözüm! Teşekkürler. Ofset şeyi yapmak doğru gelmiyordu.
hyd00

2
bu kod satırını gezinti yığınındaki önceki denetleyiciye yazarsanız bu çözüm mükemmel çalışır.
Bohdan Savych

128

Storyboard'ları kullanıyorsanız Attributes Inspector, ViewController'a gidebilir Navigation Item(üzerine tıklayın Navigation Bar) ve Back Buttonözelliği "" (bir boşluk karakteri) olarak ayarlayabilirsiniz . Bu, Geri Düğmesi başlığını bir boşluk karakterine ayarlar ve köşeli çift ayraç görünür. Kod ile uğraşmanıza gerek yok.

örnek resim

Bunun, bu Denetleyiciye, bu Denetleyicide görüntülenecek olan için değil, üstüne itilmiş olandan bu Görünüm Denetleyicisine yönelecek Geri DüğmesiBack Button başlığını ayarlayacağını unutmayın !Back Button


10
Keşke bunu daha fazla değerlendirebilseydim: "Bunun, bu Görünüm Denetleyicisi'ne geri dönecek Geri Düğmesi başlığını, bunun içinde görüntülenecek Geri Düğmesi için değil, üstüne itilmiş olandan ayarlayacağını unutmayın. Denetleyici!"
Jayson Lane

121

Bu, herhangi bir metin olmadan sadece 'arka' şivronu görüntülemek için işe yarar:

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

viewDidLoadGezinme çubuğunu sunan View Controller'da bu özelliği ayarlayın ve hile yapacaktır.

Not: Bunu yalnızca soru kapsamında olan iOS 7'de test ettim.


33
Bunun, gezinme çubuğunun ortasındaki başlık etiketini kaldırmanın bir yan etkisi vardır.
Pwner

7
Aynı özelliğe sahip 'viewWillAppear' öğesinde, itilen VC'nin başlığını ayarlayın. Bu şekilde kaldırılmaz.
Guto Araujo

5
Bu kod parçasını -viewDidLoadGeri metnini istemediğim VC'ye taşıdım . Ancak, daha sonra öğrendiğim navigationController, Başlık metninden 2. VC'yi açtığımda , hemen değil, kısa bir süre sonra ortaya çıkmasıydı. Sanırım bir video bunu daha iyi gösterecekti, işte burada: link
Pan Ziyue

1
Bu en iyi cevap değil, lütfen andyleehao'nun cevabına bakın: [[UIBarButtonItem görünümü] setBackButtonTitlePositionAdjustment :BarMetrics: UIBarMetricsDefault];
lmnbeyond

1
Bu, Apple'ın belgelerine göre doğru cevaptır: "Alıcı gezinme öğesi yığınındayken ve üstten ikinci olduğunda - başka bir deyişle, görünüm denetleyicisi kullanıcının geri gideceği görünümleri yönetir - bu özellikteki değer en üstteki gezinme çubuğundaki geri düğmesi için kullanılır. Bu özelliğin değeri sıfırsa, sistem geri düğmesinin metni olarak "Geri" dizesini kullanır. "
Raphael Oliveira

27

Düğmenin başlığını ayarlarken @ "" yerine @ "" kullanın.

--DÜZENLE--

Diğer dizeleri denediğinizde herhangi bir değişiklik olur mu? Kendimi başarıyla aşağıdaki kodu kullanıyorum:

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

backString, iOS 7 veya daha düşük bir sürüme bağlı olmamıza bağlı olarak @ "" veya @ "Geri" olarak ayarlanan bir değişkendir.

Dikkat edilmesi gereken bir şey, bu kodun geri düğmesini özelleştirmek istediğim sayfa için denetleyicide olmamasıdır. Gezinti yığınında daha önce denetleyicide.


Hmm, iOS 7 bunu değiştirmiyor gibi görünüyor. Başlık olarak "Geri" yi kullanmaya devam eder. Onun setLeftBarButtonItem:backButtonyerine koyarsam hiçbir şey olmazdı.
Pan Ziyue

1
Bu durumda ve başlığı başka bir şeye ayarladığınızda hiçbir şey olmuyorsa, kodunuzu üst görünüm denetleyicisine taşımayı denemeniz gerektiğini düşünüyorum. Benim hazırlıkForSegue yönteminde yukarıda yayınlanan kodu kullanıyorum.
Kamaros

27

resim açıklamasını buraya girin

Bazen olayları bağlam içinde görmek faydalı olabilir. İşte "geri" metnini gizleyen ancak yine de oku gösteren minimal bir proje.

Film Şeridi

resim açıklamasını buraya girin

"İkinci Görüntü Denetleyicisini Göster" düğmesinden ikinci görüntü denetleyicisine bir gösteri seguei vardır.

Ayrıca bir başlık olması için ikinci görünüm denetleyicisine Gezinme Öğesi ekledim. Bu isteğe bağlıdır. Geri düğmesini etkilemez.

kod

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
}

Alternatif yöntem (yalnızca IB, kod yok)

Film şeridinde ilk görünüm denetleyicisi için gezinme öğesini seçin (ikincisini değil). Geri Düğmesi metni için bir boşluk girmeniz yeterlidir.

resim açıklamasını buraya girin


"İlk görünüm denetleyicisi için (ikincisi değil)" gibi geri gelmek istediğiniz VC'nin adı olduğu için bu başlığı vermek sizin sorumluluğunuzdur.
buguibu

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

1
TopItem yerine backItem kullanabilirsiniz. TopItem başlığı gizlerken, backItem geri düğmesi başlığını gizler.
Ravi Ojha

2
ChildViewController, NavigationController'ın çocuk yığınında 2+ derinlikteyse tek çözüm budur
Nathaniel Blumer

2
Bu, önceki görünüm denetleyicisinin başlığını da kaldıracaktır. Çoğu durumda, bu
emilecek

11

İOS7'de Apple, UINavigationBar'a 'backIndicatorTransitionMaskImage' ve 'backIndicatorImage' adlı iki yeni özellik tanıttı.

Sadece bir kez arayarak:

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

Varsayılan chevron glifi yerine özel bir görüntü oluşturur ve keyWindow'un renk tonunu devralır.

Ve başlığı kaldırmak için Kamaros'un cevabını önereceğim. Bu kodu, yeni görünüm denetleyicinizi iten görünüm denetleyicisinde aramayı unutmayın. İOS UIBarButtonItem'in başlık metnini kaldırma


Renk tonunu ayarlamak için [[UINavigationBar görünümü] setTintColor: [UIColor whiteColor]];
Mazen Kasser

10

Verilen cevaplarla pek başarılı olamadım ama etrafta gerçekten basit bir iş buldum. Film şeridinizde UIViewController Gezinme Öğenizi tıklayabilir ve geri düğmesi metnini ayarlayabilirsiniz. Tek bir alana yerleştirdim ve bana aradığım davranışı verdi.resim açıklamasını buraya girin


10

Bu iOS10'da benim için çalıştı. Bunu, görünüm denetleyicisinin viewDidLoad öğesinden çağırın.

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

6

İOS7 ve 6'da çalışan bu soruna basit bir çözüm, viewDidLoad'da özel başlık görünümü ayarlamaktır:

- (void)viewDidLoad {

    [super viewDidLoad];

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

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

Ardından, viewWillAppear'da: güvenle arayabilirsiniz

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

Başlık görünümünüz özel görünüm olduğundan, gezinme yığınında geri giderken üzerine yazılmaz.


Ben boş UILabel değil, sadece kodun ikinci kısmı gerekli. [self.navigationItem.backBarButtonItem setTitle:@" "];ViewWillAppear'da arıyordum , ancak kalıcı bir görünümü reddettikten sonra sunulan görünümler üzerinde çalışmıyordu.
Diziet

6

Aslında bunu tek bir numara ile yapabilirsiniz:

UINavigationBarSınıfı geçersiz kılın ve şu kod satırını ekleyin:

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

Ardından UINavigationController, bu özel UINavigationBar sınıfıyla başlatın.UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

Bu yardımcı olur umarım


Bu benim için çalıştı. Her ne kadar iOS 7'deki itme animasyonunda hafif bir kekemelik varmış gibi görünse de: başlık, geri düğmesi için yer açıyor gibi görünüyor, çünkü yok.
zekel

Evet, doğrudan navigationItem.title öğesini ayarlamak yerine özel titleView kullanmayı deneyin. Bunun sorununuzu çözmesi gerektiğini düşünüyorum.
rordulu

Bu çözüm harika çünkü küresel olarak alt sınıfa sahip her navigationBar için. Teşekkürler
Yetispapa

5

DonnaLea'nın cevabını kullanarak birlikte bir şeyler kaldırmayı başardım. Çözüm benim UIViewController alt sınıfımda şöyle görünür:

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
    }
}

Orijinal yanıtla ilgili sorun, geri döndüğünüzde başlığı denetleyiciden kaldırmasıdır. ViewWillDisappear'da başlığı sıfırlamaya çalışmak geçiş işleminde çok geç; Güzelce animasyon yapmak yerine başlığın geri çekilmesine neden olur. Ancak willMoveToParentViewController daha erken gerçekleşir ve doğru davranışı sağlar.

Dikkat: Bunu yalnızca normal bir UINavigationController push / pop ile test ettim. Diğer durumlarda beklenmeyen ek davranışlar olabilir.


4

İlk ViewController'ınızın preparForSegue: yönteminde, bu görünümlerin başlığını @ "" olarak ayarlarsınız, böylece bir sonraki görünüme basıldığında önceki "" olacak olan ViewController başlığını görüntüler.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

Bununla ilgili tek sorun, geri düğmesine bastığınızda önceki görünümünüzün bir başlığı olmayacağından, viewWillAppear'a tekrar ekleyebilirsiniz:

- (void)viewWillAppear:(BOOL)animated{
    self.navigationItem.title = @"First View Title";
}

Bu çözümü çok sevmiyorum ama işe yarıyor ve bunu yapmanın başka bir yolunu bulamadım.



3

Cevapların hiçbiri bana yardımcı olmadı. Ama bir hile yaptı - sadece itmeden önce (geri düğmesinin nereye gideceği) görünüm denetleyicisinin başlığını temizledim.

Dolayısıyla, önceki görünümde bir başlık yoksa, iOS 7'de geri düğmesinde metin olmadan yalnızca bir ok bulunur.

On viewWillAppearitme bakış, ben orijinal başlığı geri yerleştirilir.


1
Hmm, bu hile çalışıyor. Ancak oradaki kelimeler bazen titreyecek gibi görünüyor. Çok iyi bir çözüm değil ama yine de iyi bir çözüm. +1
Pan Ziyue

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

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

Aynı sorunu yaşıyordum ve bu şekilde yaptım.

--DÜZENLE--

gerçekten tüm UIBarbuttonItem başlık metnini kaldırmak istediğinizde bu bir çözümdür. Yalnızca arka çubuk düğmesi öğesinin başlığını kaldırmak istiyorsanız, tek bir basit çözüm yoktur. Benim durumumda, başlık metnini göstermesi gereken sadece birkaç UIBarButtonItems'e sahip olduğum için, sadece bu belirli düğmelerin titleTextAttributes'ını değiştirdim. Daha spesifik olmak istiyorsanız, sadece gezinme çubuğu düğmelerini değiştirecek aşağıdaki kodu kullanın:

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

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

1
Bu benim için işe yarıyor, ancak geri vururken metni kısaca görebilirsiniz.
Diziet

3
Devlet için aynı eklemeyi deneyin @Diziet UIControlStateHighlightedyanı
CoderPug

2
Bu iyi çalışıyor, ama bu sadece Geri Düğmesi değil, diğer tüm düğmeleri "gizliyor" ... Bunu çözmek için herhangi bir fikir var mı?
Urkman

3

Bu alt sınıf kullanıyor navigationController "Geri" kaldırır.

Bunu uygulama üzerinden kalıcı olarak kaldırmak için kullanıyorum.

//.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
[[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];

1
Lütfen cevabınıza açıklama ekleyiniz.
Alex

1 gezinme çubuğuyla aynı rengi yapın 2 metin boyutunu başlığı sıkıştırmayacak kadar küçük yapın
Bill Xie

Cevabınızı inceledim, cevabınızı her zaman desteklemelisiniz.
Alex

2

Gezinme Çubuğunun Geri Düğmesini Gizle

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

2

İşte yaptığım şey, geri düğmesinin başlığını kaldırmak daha basit

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

2

Swift 3.1 UINavigationController delege yöntemini uygulayarak bunu yapabilirsiniz. Başlığı yalnızca geri düğmesiyle gizleyecektir, yine de geri ok resmini ve varsayılan işlevselliği alacağız.

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

1

Bunu da kullanabilirsiniz:

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

[temporaryBarButtonItem release];

Bu benim için çalışıyor


1
case : <Back as <

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

1

Global olarak mükemmel çözüm

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
}

en berbat çözüm ... onun da daha önce olduğu gibi alanı kullanması ... saydam hale geliyor ...
Laszlo

Uygulamanın tüm UIBarButton öğelerinden metni kaldırır
Mikel Sanchez

1

UINavigationControllerUygulamamdaki tüm gezinme denetleyicileri için özel bir sınıf oluşturuyorum ve uygulıyorum. Bu özel UINavigationControllersınıfın içinde , görünüm yüklendikten sonra UINavigationBartemsilciyi ayarladım self.

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

Sonra delege yöntemini uyguluyorum:

- (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;
}

Bu şekilde özel sınıfımı tüm gezinme denetleyicilerime atarım ve başlığı tüm geri düğmelerinden temizler. Ve sadece netlik için, her zaman diğer tüm görünüm denetleyicilerimin başlığını ayarladım, viewWillAppearböylece başlık her zaman görünüm görünmeden hemen önce güncellenir (böyle hilelerle kaldırılması durumunda).


1

Sadece Geri düğmesi gezinti öğesi için tek bir boşluk girerek çalışır !!


1
Bu bir yorum olarak cevaptan daha uygundur.
Al Lelopath

1

Benim gibi yerine özel bir görünüm kullanıyorsanız UINavigationBarve geri düğmesi ile sıkışmış iseniz o zaman biraz cludgey hissi biraz iş yapmak zorunda.

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

Görünüşe göre sunulmuyorsa, bir başlık göstermeye çalışacak olursa olsun, bu, çizilmeden ve sorunu çözmeden önce gizlendiği anlamına gelir.


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

1

Ben bunu kontrol edebilirsiniz dışarı uygulaması üzerinden tüm geri düğmesine başlıkları gizlemek için çok basit bir sıfır yapılandırma kategorisini yaptık burada . Bu soru zaten cevabı kabul etti, ancak diğerleri için yardımcı olabilir.

DÜZENLE:

.h dosyası

#import <UIKit/UIKit.h>

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

@end

.m dosyası

#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);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.