Başlık olmadan UINavigationBar özel geri düğmesi


231

İOS 7 ve sonraki sürümlerde gezinme geri düğmesini başlıksız olarak nasıl özelleştirebilirim? (yani yalnızca okla)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Ben sadece herhangi bir self.backButtonItem olup olmadığını merak ediyorum;

VEYA

böyle bir şey?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
Özel renk ve başlık olmadan chevron yapmak için @hiroshi answer + navigation bar tintColor özelliğini kullanabilirsiniz
Dmitry Zhukov

Sekme çubuğu olan ve geri düğmesinin metnini istemeyenler için düzeltme : TabBarController öğesinin viewDidLoad () öğesinde put: self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style:. sade, hedef: nil, eylem: nil)
Borzh

Yanıtlar:


313

Aslında oldukça kolay, işte yaptığım şey:

Hedef 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];

Hızlı 2

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

Hızlı 3

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

Bu satırı yığına iten görünüm denetleyicisine ( önceki görünüm denetleyicisi ) koyun . Yeni itilen görünüm denetleyicisi geri düğmesi şimdi initWithTitle için ne koyduysanız onu gösterir, bu durumda boş bir dize olur.


3
Bunu kullandım ama başlık geliyor ve animasyonlu bir şekilde kayboluyor ??
user1010819

7
Teşekkürler Kyle! İOS 7'deki varsayılan geri düğmesini yeniden adlandırmanın bir yolunu arıyordum. Bunu prepareForSeguegörünüm denetleyicime koydum ve mükemmel çalıştı.
yiwei

1
@ user1010819 Beklenen davranış budur, barButtonItems görünüm denetleyicilerini değiştirirken giriş ve çıkış hareketlendirir. Ne yapmaya çalışıyorsun?
Kyle Begeman

1
@YiweiGao Sorun değil! Doğru kodu biliyorsanız, oldukça basit olan şeylerden sadece bir diğeri! Yardımcı olduđuna sevindim!
Kyle Begeman

3
Bunun bir güncellemeye ihtiyacı olduğunu hissediyorum, şu anda hiçbir şey göstermiyor, ok varsayılan olarak orada değil mi?
Mathijs Segers

198

İOS tek ok ile geri düğmemi yapmanın kolay bir yolunu buldum.

Diyelim ki ViewB'den ViewA'ya giden bir navigasyon kontrolörünüz var. IB'de ViewA'nın gezinme çubuğunu seçin, şu seçenekleri görmelisiniz: Başlık, Bilgi İstemi ve Geri Düğmesi.

Gezinme çubuğu seçenekleri

Gezinme çubuğu seçenekleri

Hile, önceki görünüm denetleyicisi (Görünüm A) seçeneklerinde kader görünüm denetleyicisi geri düğmesi başlığınızı (ViewB) seçmektir . "Geri Düğmesi" seçeneğini doldurmazsanız iOS, önceki görünüm denetleyicisinin başlığıyla birlikte otomatik olarak "Geri" başlığını koyar . Bu nedenle, bu seçeneği tek bir boşlukla doldurmanız gerekir.

"Geri Düğmesi" seçeneğinde boşluk doldurun

"Geri Düğmesi" seçeneğinde boşluk doldurun

Sonuç:

Sonuç:


Stack Overflow'a hoş geldiniz . Henüz yapmadıysanız, turumuza bir göz atın ve yardım merkezinde nasıl çalıştığımız ve bazı topluluk gelenekleri hakkındaki makaleleri okuyun . Sitenin işlevleriyle ilgili yardıma ihtiyacınız varsa, arama yapmaktan korkmayın, ardından Meta Yığını Taşması ile ilgili bir soru sorun (yine de bir cevap bulamadıysanız). Teşekkürler ve iyi şanslar! Her neyse, resimlerinizi şimdi gönderebilirsiniz ... :)
Qantas 94 Heavy

53
işe yarıyor, sadece dikkat edin - önceki kontrol cihazı için "Geri Düğmesi" ayarlamanız gerekir (örneğin navigasyon kontrol cihazınızdaki rootViewController için)
evfemist

Burada viewA gezinme öğe üzerinde DOĞRU "hidesBackButton" set olmadığından emin olun
pul

Bana öyle geliyor ki, eğer sunum denetleyicisinin başlığı yeterince uzunsa - kısa bir başlıksa, bunun yerine kullanılacaktır.
amergin

1
benim için sadece hem kaynak hem de hedef ViewController NavigationItem Back Buttontek bir boşluk karakteri (yani hem ViewA hem de ViewB) olarak
ayarlandığında

72

Sadece bir görüntü kullanın!

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

Simge-back.png

Simge-Geri

Icon-Back@2x.png

2x @ Simge-Geri

Icon-Back@3x.png

Simge-Geri @ 23x


4
Bu çözüm ile "geri dönmek için kaydır" işlevini kaybediyor gibi görünüyorsunuz.
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selftokatlamak geri jest tutmak için hile yapar
Victor Carmouze

Bu cevabı, belki de tüm hayatımı, yani eylem seçiciyi arıyordum.
Des

29

iOS7'nin yeni arayüz kuralları vardır, bu nedenle bir UIView'a bastığınızda en azından geri oku tutmak daha iyidir. "Geri" metni program aracılığıyla değiştirmek çok kolaydır. Görünümü göndermeden önce bu kodu eklemeniz yeterlidir (Veya StoryBoard kullanıyorsanız preparaForSegue'e girin):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

Bu, varsayılan "Geri" metnini değiştirir, ancak iOS7 tarzı geri okunu korur. Görünümü itmeden önce geri okun renk tonunu da değiştirebilirsiniz:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

Umarım bu size yardımcı olur!


2
Bu gerçekten iyi çalışıyor ve diğer seçeneklerden daha iyi görünüyor. Örneğin, diğer cevapların aksine başlığın asla önceki değerine sıfırlanması gerekmez.
pr1001

26

Yapman gereken çok şey yok. Aynı şeyi film şeridinin kendisinden de elde edebilirsiniz.

Sadece kök Gezinti denetleyicisine gidin ve bir boşluk bırakın. Başlıksız geri düğmesini istediğiniz denetleyiciye değil, kök gezinme denetleyicisine unutmayın.

Aşağıdaki resme göre.  Bu iOS 7 ve iOS 8 için çalışır


Denedim, işe yarıyor. Ama yine de koddaki başlığı değiştiremiyorum.
Yu-Lin Wang

XCode7 ile çalıştı, ancak xCode8 -> ios10.X'te artık çalışmıyor, @iwasrobbed yöntemini kullandım
LucioB

Tüm dahi basit!
Illya Krit

22

İken Kyle Begeman cevabı tamamen hile yapar, mümkün kontrolör her görünümde bu kodu olması oldukça can sıkıcı. Sonunda basit bir UINavigationItemkategori buldum . Dikkat edin, işte ejderhalar! Üzgünüm, demek istediğim, dolandırıcılık:

#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

1
Kaldırdım, ancak daha sonra basit bir hack kullanmaya karar verdim - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( kaynak ) - biraz daha zarif olabilir, ancak aşırıya kaçma gibi hissettim
dmur

2
Cidden ... hepiniz başka bir çözüme geçmeyin. Kategori olarak gönderilen @nicky çözümünü uygulayın ve iki kez düşünmeyin. Bu Prefix.pch dosyasını eklerseniz, uygulama genelinde uygulanabilecek harika bir yeniden kullanılabilir çözümdür. Apple , Mevcut Sınıflara Yöntem eklemek için kategorileri kullanmaya teşvik eder . Mümkünse bundan yararlanmanız gerekir.
15'te zmonteca

Bu benim görüşüme göre en iyi çözüm, yine de "method_exchangeImplementation" biraz güvensiz, şuna bir göz atın: Swizzle ve bu NSHipster swizzling kılavuzu
Alessandro

@ AlessandroOrrù Bu özel durumda, güvenli olmalı çünkü swizzled yöntemi UINavigationItemkendi yöntemidir, kalıtım söz konusu değildir. Ve _cmdbir alıcıya karışması pek olası değildir. Her neyse, bu iyi bir nokta. Yani hepiniz, projenizde bu kadar çok yardımcı olan varsa, burada da kullandığınızdan emin olun.
secondcitysaint

21

EDIT: 2014-04-09: İtibar kazandıkça üzülüyorum çünkü artık bu numarayı kullanmıyorum. Kyle'ın cevabını öneriyorum. Ayrıca bu haber selfait self.navigationItem.backBarButtonItemgeri düğmesi görüntülenir görünüm denetleyici değil, ama olmak önceki görünümü denetleyicisi döndü.

Önceki görünüm denetleyicisi için başlık metnine ihtiyacınız yoksa, başlığı boş bir dize ile doldurmanız yeterlidir;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

Bu, itilen görüntü denetleyicisinde chevron ile "geri" gösterilmesini önleyecektir.

DÜZENLE: Boş olmayan başlık metni kullansanız bile, görünüm denetleyicisi viewWillAppear:açıldığında başlığın yanıp sönmesi dışında işlerde önceki görünüm denetleyicisinin başlığını ayarlamak çalışır. Bence "twitter uygulaması" titreşimi önlemek için daha ince kesmek gibi görünüyor.


Burada yaşadığım tek sorun, önceki görünümde başlık geri gitmek için gezinti çubuğuna bastığınızda boş oldu. Bunun herhangi bir yolu var mı?
Alioo

@Alioo "DÜZENLEME" satırında bahsettiklerimi denediniz mi?
hiroshi

20

Bu işe yarar, ancak geri dönseniz bile önceki öğenin başlığını kaldıracaktır:

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

Bu özelliği viewDidLoad, itilen Görünüm Denetleyicisinin üzerine ayarlamanız yeterlidir.


17
Bu, bir önceki öğenin başlığını kaldırsanız bile öğeye geri dönseniz bile. Çok iyi değil :(
Antzi

Her viewWillAppearzaman doğru şekilde ayarlanması için VC'nin başlığını ayarladım.
Guto Araujo

@GutoAraujo Çalışır, ancak başlık 1 veya 2 saniye gecikmeli cadı ile yeniden görünür, UX'i iyi değil.
fuiiii

XCode8 -> ios10.X'te bu sorunu
çözmenin

12

Ben böyle yapıyorum ve bunu yapmanın en basit, en iyi ve en açık yolu.

Bu yerleştirilmişse çalışır Navigation Controller

Hızlı 3

Bunu viewDidLoadGörünüm Denetleyicisine eklediğimde geri düğmesinin sadece ok olmasını istiyorsunuz.

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

Bunun @Kyle Begeman'ın cevabı ile farkı, bunu görünüm denetleyicisinde, geri düğmesinin itme yığını görünümü denetleyicisinde değil, yalnızca ok olmasını istediğiniz olarak çağırmanızdır.


7

Navigasyon backButtonItem'e istediğiniz şekilde erişemezsiniz, aşağıdaki gibi kendi geri düğmenizi oluşturmanız gerekir:

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

Ve rota dışı:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}

sonra geri düğmesinde olan güzel solma animasyonunu kaybettik
Kiddo

3
Yumuşak geçişler için bir maskeye ihtiyacınız var. "* Varsayılan şivronu değiştirmek için özel bir görüntü kullanmak istiyorsanız, özel bir maske görüntüsü de oluşturmanız gerekir. İOS 7, önceki ekranın başlığının, gezinme sırasında köşeli çift ayraçtan çıktığını veya kaybolmasını sağlamak için maskeyi kullanır geçişler."
Kullanıcı

3
@null, iOS 7'nin yan yana kaydırma hareketini kaybedeceksiniz!
Mazen Kasser

@ kullanıcı Özel görüntüyü alıyorum ama renk tonu rengi varsayılan olarak mavi. Renk tonunu nasıl ekleyebilirim? teşekkürler
Mazen Kasser

7

Hedef: Tüm geri düğmeleriniUINavigationBarbeyaz bir simgeyeözelleştirme

Adımlar: 1. AppDelete "" didFinishLaunchingWithOptions "yönteminde :

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. viewDidLoadortak süper ViewControllersınıf yönteminde :

 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
    }

Bu, C99'da "SYSTEM_VESION _...'nin örtük sürümü geçersiz" uyarısını gösteriyor.
Jayprakash Dubey

7

SWIFT 4

Özel geri düğmeleri oluşturmak ve başlıklarını kaldırmak isteyenler için lütfen görünüm denetleyicisi içinde yenisini iten aşağıdaki kod parçasını kullanın:

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)

Daha evrensel bir kullanım için aşağıdakileri yapın:

  1. Aşağıdaki gibi evrensel bir işlev oluşturun:

    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)
    }
  2. Sonra görünüm denetleyicilerinde aşağıdaki gibi kullanın:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

İOS6'dan gelen basit bir saldırı iOS7'de de çalışır:

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

Düzenleme: Bu kesmek kullanmayın. Ayrıntılar için açıklamaya bakın.


6
Bu hack'i kullanma. Apple'ın kodunda 64 bitlik cihazlarda, bir çubuk düğmesi başlık ofseti yaptığınızda modal görünümlerin görünmesini engelleyen bir hata var. Daha fazla ayrıntı .
zh.

Simülatörde değil, cihazda sadece sorunlar vardı.
zh.

Bu kesmek artık Xcode 9 / iOS 11 ile oluşturulduğunda çalışmaz. "<" Çok düşük görünecek ve hata ayıklayıcıda çalıştırıldığında kısıtlamalar göreceksiniz.
T'Pol

3

bunu kullanabilirsiniz. Bu sadece benim için UIButtonbir custumview ekleyerek benim için mükemmel çalışıyor UIBarButtonItem.

Aşağıdaki Kodu Deneyin

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

3
ancak, bu iOS 7'de hızlıca kaydırma hareketini devre dışı bırakır
user102008 15:14

3

Bir oluşturun UILabelKök görünümü denetleyicisi için istediğiniz başlığı ile ve görünümü denetleyicisi yıllardan atamak navigationItem.titleView.

Şimdi başlığı boş bir dizeye ayarlayın ve bastığınız bir sonraki görünüm denetleyicisinin metinsiz bir geri düğmesi olacaktır.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

3
 // 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];

}

3

Tüm cevaplar sorunu çözmez. Her görünüm denetleyicisinde düğme başlığının ayarlanması kabul edilmez ve başlığa ofset eklemek, bir sonraki Görünüm Denetleyicisi başlığının sağa kaymasına neden olur.

Yöntem swizzling kullanarak yöntem, sadece UINavigationItem için yeni bir uzantı oluşturmak

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

Geri kelimesini geri kelimeye ayarla, harika çalışıyor: self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel

Ne demek istiyorsun dostum? Soru, metni geri düğmesinden kaldırmakla mı ilgili?
jakub wolanski

1
Birçok Uygulama ve Apple kendi Uygulaması "<Geri" der, bu nedenle standarda bağlı kalmak iyidir. BigTakeAway ve JustEat.
Mike Zriel

2

Aşağıdaki kodu viewDidLoad uygulamasında uyguladım ve çalışıyor:

  // 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"]]];

Sadece güncellemek için Vector Icon kullanıyorum


2

UINavigationController öğesini alt sınıflandırabilir, kendini temsilci olarak ayarlayabilir ve delege yönteminde backBarButtonItem öğesini ayarlayabilirsiniz. navigationController:willShowViewController:animated:

@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

2

Başlığı boş bırak

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

Görüntüyü değiştir

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;

1

Bu çözümü iOS 5'ten beri sorunsuz kullanıyorum. Görünüm denetleyicilerimde aradığım bir yardımcı program işlevi yaptım. Bunu viewDidLoad veya sonrasında herhangi bir noktada yapmanız gerekir.

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

Bazı durumlarda gezinme öğesi zaten mevcut olabilir, diğer durumlarda oluşturulması gerekir. Bu, her iki durumu da gezinme öğesi başlığıyla uğraşmadan açıklar. Sadece içeri girerek başlığı kaldırmanıza izin verir @"".


1
Bu doğru cevap. Hile yok. Bu, başlığı ayarlamak için yalnızca iOS API'yı kullanılması gerektiği şekilde kullanıyor. Başlığı kaldırmak için @ "" olarak ayarlayın (test edildi ve iyi çalışıyor).
n13

1

Benim için çalışmanın tek yolu şuydu:

navigationController?.navigationBar.backItem?.title = ""

GÜNCELLEME:

Segue animasyonu bayrağını true (daha önce yanlış) olarak değiştirdiğimde, benim için çalışmanın tek yolu şuydu:

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

1

Gezinti Denetleyicisine katıştırılmış iki ViewController (FirstVC, SecondVC) varsa ve SecondVC'de yalnızca geri ok olmasını istiyorsanız.

Bunu FirstVC'nin ViewDidLoad'ında deneyebilirsiniz

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

Sonra SecondVC'ye bastığınızda, sadece geri ok olduğunu göreceksiniz


1

TintColor Of NavigationBar öğesini ayarlarsanız, renk tonunun görüntü rengini yansıtacağı başlıksız özel bir geri düğmesi görüntüsü ekleyin. Lütfen bu elma belgesel bağlantısını takip edin.

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

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 ];


1

Bunu kolaylaştırmak için bir uzantı yazdım:

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

}

1

ViewWillDisappear'da mevcut ViewController'ın başlığını @ "" olarak değiştirebilirsiniz ve tekrar göstermek üzereyken başlığı daha öncekine yeniden ayarlayın.

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

İ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 "" 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.


Gezinme öğesi başlığıyla uğraşmadan doğru çözüm için cevabımı görün.
Dima

Çözümünüz iOS7 geri okunu saklıyor mu? Benzer bir şey denedim ama oku kaldırdı.
Alejandro Figueroa

İOS 7'de geri oku tutar, evet. Boş bir (0 uzunluk) dizeden geçen iOS 6'da da düğmeyi tamamen kaldıracak, bu nedenle bu sadece iOS 7 için gerçekten iyi.
Dima

Çok basit bir çözüm var. Cevabımın sizin için işe yarayıp yaramadığını görün.
Guto Araujo

0

Yukarıdaki Thomas C'nin cevabına eklemek için bazen tek bir boşluk koymak işe yaramaz ve boşluk eklemeye devam etmeniz gerekir.

boş çubuk düğmesi

"Gezinme Öğesi" altında "Çubuk Düğme Öğesi -" ifadesini gördüğünüzde başarılı olduğunuzu bileceksiniz. Bu Belge Ana Hattındadır (Editör-> Belge Ana Hattını Göster). Yukarıdaki resmi gördüğünüzde, birkaç alanı silebilir ve hala çalışıp çalışmadığını görebilirsiniz.


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

Tıpkı Kyle Begeman'ın yaptığı gibi, yukarıdaki kodu kök görünüm denetleyicinize eklersiniz. Tüm alt görünüm denetleyicisi uygulanacaktır. Ayrıca, bunu initWithCoder: yöntemine ekleyerek, xib, storyboard veya kod tabanlı yaklaşımlarda kök görünüm denetleyicilerine stil uygulayabilirsiniz.

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.