UINavigationController “geri düğmesi” özel metni?


147

A düğmesinin "geri düğmesi" UINavigationControllervarsayılan olarak yığındaki son görünümün başlığını gösterir. Bunun yerine geri düğmesinde özel metin almanın bir yolu var mı?


1
Bu iş benim içinself.navigationController.navigationBar.topItem.title = @"Custom text";
huync

Yanıtlar:


342

Gönderen bu bağlantı :

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

Tyler'ın yorumlarda söylediği gibi:

bunu görünür görünüm denetleyicisinde değil, geri düğmesine bastığınızda göreceğiniz görüntü denetleyicisinde


4
You should . releaseUIBarButtonItem
Mehrdad Afshari

217
Ayrıca, görünüm denetleyicide yığını bir düzey yukarı yapmanız gerektiğini unutmayın. Başka bir deyişle, bunu görünür görünüm denetleyicisinde değil, geri düğmesine basıp basmadığınızı göreceğiniz görünüm denetleyicisinde yapın.
Tyler

6
İlk başta bunu anlamadığım için Tyler'ın yorumunu açıklığa kavuşturmak için: Bir görünüm denetleyicilerinde backBarButtonItem'in ayarlanması navigationItem, bu görünüm denetleyicisine GERİ almak için gösterilecek düğmeyi ayarlıyor. Ayrıca, ok düğmesi için düğme stili olmasa da, bu düğmenin yine de ok stilini alacağını unutmayın. UIBarButtonItemStylePlain kullandım ve hala ok düğmesi stilini olsun.
Jon Steinmetz

3
Öneri: Stili kabul etmek yerine, o anda ayarlanan stili geçirin. Bu yanıt kodunda, UIBarButtonItemStyleBorderedözelliğe yapılan bir çağrı ile değiştirin self.navigationItem.backBarButtonItem.style. Belgeler: developer.apple.com/library/ios/documentation/uikit/reference/…
Basil Bourque

1
ARC altında otomatik kiralama çağrısını dışarıda bırakmanız gerektiğini unutmayın. böylece self.navigationItem.backBarButtonItem = [[UIBarButtonItem tahsis] initWithTitle: @ "Özel Başlık" stili: UIBarButtonItemStyleBordered target: nil action: nil];
bkbeachlabs

43

Metni Arayüz Oluşturucu'da ayarlayabilirsiniz:

ViewController'ın geri düğmesinin döneceği gezinme öğesini seçin:

resim açıklamasını buraya girin

Yardımcı programlar paneli özellik denetçisinde Geri Düğmesi için etiketinizi girin:

resim açıklamasını buraya girin

Kabul edilen cevapta olduğu gibi koddaki başlığı ayarlamak yerine bu yaklaşımı tercih ederim.

Ayrıca, görünüm denetleyicide yığını bir düzey yukarı yapmanız gerektiğini unutmayın. Başka bir deyişle, bunu görünür görünüm denetleyicisinde değil, geri düğmesine basıp basmadığınızı göreceğiniz görünüm denetleyicisinde yapın.
--Tyler


Bu şimdiye kadar bulduğum en iyi cevap.
Ayan Sengupta

2
Açık olmak gerekirse, görünüm denetleyicisinin nitelik denetçisinin değil, görünüm denetleyicisinin Gezinme Öğesinde ayarlanması gerekir.
Patrick

Bu bulduğum en iyi cevap.
bicepjai

Bu en iyi cevap
Alex Brown

2
Xcode 6.1.1'den itibaren ve iOS 7'de çalışıyorsa, orijinal önceki görünüm başlığınız, burada ayarladığınız geri düğme başlığını geçersiz kılar. Önceki görünümün başlığı 11 karakter sınırından fazla içeriyorsa, bir sonraki görünümün geri düğmesi "Geri" diyecektir. Burada en çok oylanan cevapta gösterildiği gibi sıfırdan yeni bir gezinti çubuğu öğesi oluşturmak dışında bir yolu yoktur.
ışın

22

Bunu kullanıyorum:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

Bu neredeyse benim için çalışıyor, ancak geri düğmesini tıkladığımda, metin animasyon süresi boyunca ebeveynin başlığına geri dönüyor :-(
Danny Tuppeny

3
Bu, yığındaki denetleyicinin Geri düğmesi başlığını değiştirir. O anda görüntülenen denetleyicinin Geri düğmesi başlığını değiştirmez. Daha da kötüsü: önceki denetleyiciden önceki denetleyicinin başlığını değiştirir!
Leviathan

Diğer yorumcular tarafından belirtildiği gibi, bu yöntem biraz savunulamaz. API'nin bunu kullanmayı amaçladığı gibi olmadığından bunu yapmanızı tavsiye etmem. Gelecekte zor hatalar için kendinizi kuruyor olabilirsiniz!
RickDT

11

Yığına başka bir denetleyiciyi itmeden önce denetleyicinin başlığını ayarlayarak bunun için kullanışlı bir çözüm buldum:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

Ardından, orijinal başlığı şu şekilde ayarladığınızdan emin olun viewWillAppear:

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

Bu, UINavigationControllerbir push işlemi sırasında geri düğmesini oluştururken varsayılan davranışın önceki denetleyiciden başlık kullanmak olduğu için çalışır.


1
Buradaki sorun, canlandırdığı ve biraz naff göründüğü için başlık eski görünümde değişiyor. Burada verilen çözümlerin hiçbiri istediğiniz gibi çalışmıyor :-(
Danny Tuppeny

1
Bu durumumda mükemmel çünkü önceki ekranda NavBar'ı göstermiyorum ve sadece titleLabel'ı yeni ekrandaki geri düğmesinden kaldırmak ve sadece iOS7 chevron okuna sahip olmak istiyorum. Bu yüzden başlık için boş bir NSString değişmezi ayarlayabilirim.
siburb

itme görünüm denetleyicisi arkaya dokunun zaman istisna yükseltmek
Sumit

7

Geri düğmesinin başlığı varsayılan olarak önceki görünümün başlığına ayarlanır, bu nedenle kullandığım hızlı bir numara aşağıdaki kodu önceki görünümün .m dosyasına yerleştirmektir.

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

Bu, birçok durum için oldukça iyi çalışıyor ve oldukça basit ... sadece gözlem, bu yöntemlerden herhangi birinin geçersiz kılınmasının, süper yöntemin yeni yöntemde bir noktada çağrılmasını gerektirdiğidir.
izk

2
Bu yöntemle, itme animasyonu gerçekleşmeden önce üst görünümün başlığının 'Geri' olarak değiştiğini göreceksiniz. (Ve sorta berbat, bunu viewDidDisappear yöntemine taşırsanız, geçişin ardından anahtarın gerçekleştiğini görürsünüz.)
James Boutcher

Bu yöntemi seviyorum ama bununla yüzleştiğim sorun "Orijinal Başlık" iyi ayarlanır ama "Geri" daha uzun ise bir üç nokta ile geliyor, çünkü görünüm henüz görünüm hiyerarşisinde olmadığı için olması gerekir , başlık görünümünü yayınlamaz. Yukarıdaki @ JamesBoutcher tarafından açıklanan sorun, animasyonun hızlı başlangıç ​​hızı nedeniyle benim için fark edilmiyor. Aslında, yeni karşılaştığım sorunun özellikle bu sorunun ön plana çıktığı yavaş biten animasyon nedeniyle fark edildiğini fark ettim.
trss

Stackoverflow.com/questions/1441699/… adresindeki yanıt gerekenden daha fazla özelleştirme gibi görünse de, bu belgelenmiş bir yöntemdir ve daha da önemlisi amacımıza daha uyumlu görünmektedir.
trss

6

init yönteminize aşağıdaki kodu ekleyin:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

daha sonra viewcontroller'ın işten çıkarılmasına izin vermek için basit bir yöntem ekleyin:

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

3

ViewDidLoad veya loadView içine aşağıdaki kodu ekleyin

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

İOS 9 ile iPhone ve iPad'de test ettim


Self.navigationController? .NavigationBar.backItem? .Title = "Özel Metin" olmalıdır
Peacemoon

1
ihtiyacım olan tek fark navigationControllerve topItemözellikleri üzerinde isteğe bağlı zincirleme , örneğin:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Bulwinkel

2

Dizinin cevabına ekleme. Apple'ın belgelerinden backBarButtonItem bildiriminin şu olduğuna dikkat edin :

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Bu nedenle, rein'in cevabı bellek sızdırır, çünkü sentezlenmiş ayarlayıcı retainonu geçtiğiniz örnek olur ve bu hiçbir zaman açıkça serbest bırakılmaz. Bunu kullanarak bunu çözebilirsiniz.autorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

Ya da bir değişkeni örneğe işaret edebilirsiniz, böylece daha sonra açıkça serbest bırakabilirsiniz:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

Bu yardımcı olur umarım!


Bu günlerde, ARC ile otomatik yayın hakkında endişelenmenize gerek yok (ve gerçekten de ARC etkin bir projede otomatik yayınlamaya çalışırsanız derleyici hata verecektir)
Eric Goldberg

2
- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

2

İlginç bir şey keşfettim. Eğer yöntemi alt sınıfı UINavigationControllerve geçersiz kılar pushViewController:animated:ve böyle bir şey yaparsanız: (ARC kullandığımı unutmayın)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

Daha sonra ViewControllersnavigasyon kontrol cihazınızla itilen herkes için otomatik olarak "Geri" düğmesine sahip olacaktır. Belirli görünüm denetleyicilerinin metnini değiştirmek isterseniz, viewcontroller'ı belirli bir sınıfa veya kendi özel protokolünüze (viewcontroller'ınızın böyle bir yöntem backButtonTextveya bunun gibi aptalca bir şey içerebileceği miras ) atayabilirsiniz. viewcontroller'da gelen ve geri düğmesi metnini özelleştirebileceğiniz belirli bilgiler. Şimdi geri düğmesi metni sadece sorumluluğu elinde tutması gereken bir yerde halledilir. İtiraf etmeliyim ki metni değiştirmek için yeni bir düğme yaratılması berbat, ama iyi.

Herkes neden böyle yapmamanın bir nedeni düşünebilir? En azından görünüm denetleyicisi başlıkları ile uğraşmanız veya gezinme denetleyicisindeki görünüm denetleyicisine basmadan önce yeni bir geri düğmesi oluşturmayı hatırlamanız gerekmez.


0

dizinin cevabı iyi çalışıyor.

Birden fazla görünüm denetleyicisine basarsanız, her biri için değiştirilen geri düğmesi başlığının görüneceğini unutmayın; bu, istediğiniz gibi olmayabilir.

Bu durumda, bir görünüm denetleyicisine her bastığınızda özel UIBarButtonItem öğesini oluşturmanız gerekir.

Ayrıca, görünüm denetleyicisini itmeden önce bunu yaptığınızdan emin olun , aksi takdirde başlık değiştikçe bir ekran hıçkısı alırsınız.


0

Aubrey'nin önerisine genişleyerek, bunu çocuk görünümü denetleyicisinde yapabilirsiniz:

ebeveynin navigationItem.title ve ebeveynin navigationItem öğelerinin eski değerlerini saklamak için iki değişken oluşturun

UINavigationItem* oldItem;
NSString* oldTitle;

alanına viewDidLoadaşağıdakileri ekleyin:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

alanına viewWillDisappearaşağıdakileri ekleyin:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

Mükemmel değil. Yeni denetleyicinin animasyonu sırasında üst görünümün başlığının değiştiğini göreceksiniz. AMA bu, geri düğmesini özel olarak etiketleme ve standart bir geri düğmesi gibi şekillendirme amacına ulaşır.


0

Bunu sana koy viewDidLoad, umarım aradığın şeyle sonuçlanır

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

0

hızlı 3'te GELEN denetleyicide (bazen daha mantık ..) başlık ayarlamak istiyorsanız:

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

yaklaşan denetleyicide:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

genellikle self.setBackButtonNavBar'ı bir denetleyici uzantısına koydum.


0

Bunun eski bir soru olduğunu ve cevapların türünün güncellendiğini biliyorum!

Bunun kolay yolu bunu üst ViewController'da yapmaktır:

yani sizi bir sonraki görünüm denetleyicisine götüren.

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

-1

Bunu kodda yapmak, geri düğmesi stilini kaldırın UINavigationConroller. Görünümlerinizin her birine bir Gezinme Öğesi eklerseniz, öğesindeki arka düğmenin başlığını ayarlayabilirsiniz StoryBoard.

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.