Bagaimana cara mengubah judul tombol "kembali" pada Bilah Navigasi

224

Saat ini nilai default tombol bilah kiri adalah judul tampilan yang memuat yang sekarang, dengan kata lain tampilan yang akan ditampilkan ketika tombol ditekan (tombol kembali).

Saya ingin mengubah teks yang ditampilkan pada tombol ke yang lain.

Saya mencoba meletakkan baris kode berikut dalam metode viewDidLoad view controller, tetapi sepertinya tidak berhasil.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

Apa yang harus saya lakukan?

Terima kasih.

Lembah
sumber

Jawaban:

345

Ini harus ditempatkan dalam metode yang memanggil ViewController berjudul "NewTitle". Tepat sebelum pernyataan push atau popViewController.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
Yordania
sumber
47
Ketika di pengontrol tampilan anak, memanggil ini dari pengontrol tampilan anak tidak akan berfungsi. Anda harus memanggil ini dari pengontrol tampilan induk, sementara di dalam pengontrol tampilan anak.
Alex Reynolds
2
Untuk mengubah tombol kembali untuk pengontrol tampilan tingkat ketiga (dorongan kedua), saya harus menggunakan baris berikut alih-alih jawaban di atas: [[self.parentViewController navigationItem] setBackBarButtonItem: newBackButton]; Apakah saya melakukan sesuatu yang salah?
JonB
4
Jordan mengatakan dia "[menambahkan] sedikit lebih jelas tentang di mana menempatkan kode." Di sini bahkan lebih jelas: letakkan di pengontrol pertama (alias induk), tepat sebelum panggilan untuk mendorong pengontrol kedua (alias anak).
Manfaat
1
Anda dapat membuat BaseViewController khusus dan memasukkannya ke-viewDidLoad:
ArtFeel
2
Anda tidak harus melakukan ini dengan benar sebelum mendorong atau pop. Anda bisa melakukannya di viewDidLoad atau loadView atau di mana pun Anda mengatur judul dan properti lainnya untuk tampilan ini. Jawaban Victor Bogdan di bawah ini lebih jelas, IMHO.
Joe Strout
98

Di ChildVC ini bekerja untuk saya ...

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

Bekerja di Swift juga!

self.navigationController!.navigationBar.topItem!.title = "Back"
Peter Pan
sumber
4
Diuji dan diverifikasi di iOS 7 dalam Xcode 5.0.2. Ini AKAN mengubah judul layar sebelumnya untuk Kembali ketika Anda kembali ke sana.
Alex Zavatone
Solusi paling sederhana. Berfungsi pada iOS 6 dan 7. Masukkan basis UIViewController dan selesai. Jauh lebih baik daripada solusi IB atau pengaturan dalam mendorong vc.
Eric Chen
46
itu mengubah judul controller tampilan sebelumnya, itulah masalah dalam solusi ini
Nikita
2
@Nikita, Anda dapat mengatur ubin kembali di viewWillDisappear
Dan Beaulieu
81

Berikut ini dokumentasi untuk backBarButtonItem :

"Ketika item navigasi ini tepat di bawah item teratas di tumpukan, pengontrol navigasi memperoleh tombol kembali untuk bilah navigasi dari item navigasi ini. [...] Jika Anda ingin menentukan gambar atau judul khusus untuk tombol kembali , Anda dapat menetapkan item tombol bilah khusus (dengan judul atau gambar khusus Anda) ke properti ini sebagai gantinya. "

Lihat Pengendali A ( pengontrol tampilan "induk" ):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

Ketika yang lain controller tampilan B adalah di atas tumpukan navigasi, dan A adalah tepat di bawah ini, B 's tombol kembali akan memiliki judul 'pendek' .

Victor Bogdan
sumber
4
bagian yang sulit adalah Anda perlu mengatur tombol kembali pada pengontrol tampilan PARENT dan bukan tampilan anak. Buang satu jam baru saja menemukan ini.
Merkurial
56

di Xcode 4.5 menggunakan storyboard, sejauh ini solusi termudah yang saya temukan ketika nilai tombol Kembali tidak harus berubah secara dinamis adalah dengan menggunakan bidang "Tombol Kembali" yang terkait dengan Item Navigasi pada Pengontrol Tampilan yang Anda gunakan ingin tombol "Kembali" untuk mengatakan sesuatu yang lain.

mis. pada tangkapan layar di bawah, saya ingin tombol Kembali untuk pengontrol tampilan yang saya tekan untuk memiliki "Kembali" sebagai judul tombol Kembali.

masukkan deskripsi gambar di sini

tentu saja, ini tidak akan berfungsi jika Anda perlu tombol kembali untuk mengatakan sesuatu yang sedikit berbeda setiap kali ... ada semua solusi lain di sini untuk itu.

john.k.doe
sumber
Pertanyaan asli tidak mengatakan apa-apa tentang menggunakan storyboard, jadi pasti baik ini bukan jawaban yang diterima, namun benar ini adalah solusi untuk pengembangan berbasis storyboard.
villapossu
42

Saya tahu, pertanyaannya sudah sangat lama, tetapi saya menemukan solusi yang bagus.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Bekerja dari childView! Diuji dengan iOS 7.

seniorbenelli
sumber
Ini sepertinya hanya bekerja pada satu level. Itu tidak bekerja untuk anak dari anak untuk saya. iOS 8.
narco
26

Mungkin saya terlalu sederhana tetapi dari dokumentasi Apple, kata-katanya adalah:

Jika item tombol bilah khusus tidak ditentukan oleh salah satu pengontrol tampilan, tombol kembali default digunakan dan judulnya disetel ke nilai properti judul pengontrol tampilan sebelumnya — yaitu, pengontrol tampilan satu tingkat turun pada tumpukan.

Solusi yang ditandai benar di atas menetapkan item tombol default dari pengontrol induk. Ini jawaban yang tepat, tapi saya menyelesaikan masalah dengan mengubah self.titleproperti UIViewController tepat sebelum mendorong controller baru ke tumpukan NavigationController.

Ini secara otomatis memperbarui judul tombol kembali pada pengontrol berikutnya, dan selama Anda mengatur self.titlekembali apa yang seharusnya, viewWillAppearsaya tidak dapat melihat metode ini menyebabkan terlalu banyak masalah.

Jessedc
sumber
19

Ini bekerja lebih baik untuk saya. Coba:

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
Felipe FMMobile
sumber
19

Di Swift / iOS8, yang berikut ini berfungsi untuk saya:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Diporting dari jawaban Felipe.

Duncan Smith
sumber
sintaks swift 1.1 adalahself.navigationController?.navigationBar.topItem?.backBarButtonItem
Warren Burton
3
Gaya harus UIBarButtonItemStyle.Plain
Mikro
2
Terima kasih untuk ini. Apa API yang benar-benar menyedihkan ini. Dan perwakilan dari UIKit secara umum. Antara bilah navigasi dan Bilah Status di iOS, sungguh mengherankan kami masih mengembangkan untuk platform terkutuk ini. Terima kasih bayi yesus untuk Stack Overflow dan kontributornya!
Womble
@Wobmle: Anda harus mengembangkan untuk Android selama beberapa bulan;)
fl034
17

Ok, ini jalannya. Jika Anda memiliki view controller "first" dan Anda menavigasi view controller "second" lainnya dengan menekan tombol atau dll. Anda perlu melakukan beberapa pekerjaan. Pertama, Anda perlu membuat BarButtonItem dalam metode viewDidLoad view controller kedua seperti ini;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

Setelah Anda melakukannya, Anda perlu menulis kode untuk tindakan "btnBack" di file .m yang sama seperti ini;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

Itu saja.

EEE
sumber
2
A leftBarButtonItemtidak memiliki tampilan a backBarButtonItem, jika itu penting dalam desain aplikasi.
Alex Reynolds
1
Dari solusi yang diposting (terima kasih banyak) yang satu ini tampaknya berhasil, meskipun seperti yang dinyatakan Alex di atas, tombol bilah kiri tidak terlihat seperti item bilah belakang. Bagaimana saya bisa membuatnya terlihat seperti item bar belakang ???
Dale
17

Saya memiliki pengontrol tampilan induk dengan judul yang sangat panjang. Ini menghasilkan teks tombol kembali berdarah ke judul pengontrol tampilan anak.

Setelah mencoba banyak solusi yang berbeda, inilah yang akhirnya saya lakukan (memperluas pendekatan @ john.k.doe):

Menggunakan Xcode 7.2, Swift 2

  1. Di Storyboard, tambahkan a Navigation Itemke adegan Parent View Controller (bukan VC anak)

item navigasi

  1. Di bagian Attributes Inspectorbaru Anda Navigation Item, ketikkan spacekarakter di Back Buttonbidang. Lebih lanjut tentang ini nanti.

item navigasi di Hirarki Lihat

tambahkan karakter spasi ke bidang Tombol Kembali

  1. Di pengontrol tampilan Parent , tambahkan kode berikut:

potongan:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

Penjelasan:

Jenis tombol kembali milik pengontrol tampilan induk. The Navigation Itemmemberi Anda pegangan untuk tombol kembali, sehingga Anda dapat mengatur judul dalam kode atau dalam Storyboard.

catatan:

Jika Anda meninggalkan Navigation Item Back Buttonteks sebagai string kosong default, judul tombol kembali akan menjadi "Kembali".

Pendekatan lain berhasil, mengapa menggunakan yang ini ?:

Meskipun mungkin untuk mengganti judul tombol kembali pada pengontrol tampilan anak, itu merupakan tantangan untuk mengatasinya sampai judul tersebut telah melintas sebentar di layar.

Beberapa pendekatan membangun tombol kembali baru dan menimpa yang sudah ada. Saya yakin itu berfungsi, dan mungkin perlu dalam beberapa kasus penggunaan. Tapi saya lebih suka memanfaatkan API yang ada bila memungkinkan.

Mengubah titlepengontrol tampilan induk adalah solusi tercepat untuk beberapa situasi. Namun, ini mengubah judul induk sehingga Anda harus mengelola status. Hal-hal juga menjadi berantakan dengan Tab Bar Controllerkarena perubahan judul menyebabkan efek samping dengan Tab Bar Itemjudul.

Robert Chen
sumber
10

Bagi mereka yang menggunakan storyboard cukup pilih induk (bukan yang memegang tampilan target) melihat bingkai pengontrol (pastikan Anda mengklik kanan pada bilah Navigasi, lalu buka inspektur atribut, di mana Anda akan menemukan tiga input formulir. Yang ketiga " tombol kembali "adalah yang kita cari.

pedrouan
sumber
4
ini adalah solusi terbaik jika Anda tidak peduli dengan lokalisasi.
MiQUEL
7

Versi cepat:

Di ViewController anak Anda:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
buxik
sumber
ini sebenarnya akan mengubah judul view controller sebelumnya di stack menjadi "TEXT", yang kurang dari ideal.
gravitron
6

Inilah cara lain untuk melakukannya.

Di pengontrol tampilan orang tua Anda, terapkan metode berikut:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

Di pengontrol tampilan anak Anda, saat Anda ingin mengubah judul, ini akan berfungsi:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Saya tidak pernah bisa membuat parentViewControllerproperti bekerja:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

Saya tidak tahu apakah itu bug atau saya tidak menggunakannya dengan benar. Tetapi mengambil controller tampilan kedua-ke-terakhir dalam viewControllersarray menunjuk ke controller tampilan induk, dan saya dapat memanggil metode induk dengan benar dengan referensi itu.

Alex Reynolds
sumber
6

baik. Saya pribadi membenci semua opsi ini. Karena itu saya datang dengan saya sendiri.

Berdasarkan informasi yang saya lihat. Tampaknya pengontrol tampilan Sebelumnya mengendalikan tombol "Kembali" sendiri yang akan disajikan pada pengontrol tampilan yang didorong.

Saya telah membuat metode Beban Malas untuk item navigasi pada controller yang ingin Tombol Kembali diubah.

Milik saya adalah Pengendali Pembeli Undangan

Undangan Pembeli adalah teks yang disetel secara default.

tetapi tombol kembali perlu Undang

Berikut adalah kode yang saya gunakan untuk membuat tombol kembali.

Saya menempatkan kode ini di bagian atas file Controller's Implementatio (.m) dan secara otomatis mengalahkan metode super.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

Saya merasa ini adalah cara yang jauh lebih elegan untuk mencapai ini.

Saya menempatkan kode ini di satu tempat, dan secara otomatis akan diisi ketika dibutuhkan.

Tidak perlu memanggil kode sebelum setiap permintaan push.

Semoga ini membantu

The Lazy Coder
sumber
5
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
Gopikrishna
sumber
5

Inilah jawabannya:

Dalam viewDidAppear:animated(TIDAK dalam viewDidLoad) lakukan hal berikut

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

Itu kalau mau menjaga bentuk tombol kembali.

Basheer_CAD
sumber
Tidak buruk kecuali bahwa mereka dapat melihatnya mengubah judul. Saya mencoba di viewWillAppear dan tidak berhasil.
Travis M.
5

Tidak ada solusi yang dijelaskan di sini yang berfungsi untuk saya. Jadi yang saya lakukan adalah menghapus judul dari adegan di mana saya berasal dengan cara berikut:

self.title = @"";

Jadi ketika adegan baru disajikan teks kembali tidak muncul.

Saya absolut setuju bahwa ini sama sekali bukan solusi yang jelas, tetapi berhasil dan tidak ada yang dijelaskan bekerja untuk saya.

Javier Calatrava Llavería
sumber
Man, aku harus memberitahumu, ini tahun 2017 dan itu masih menyebalkan dalam $ untuk menangani tombol kembali. Metode Anda bekerja untuk saya dan saya berakhir dengan tanda "<" meskipun saya ingin kata "Batal", tetapi saya akan puas dengan apa yang saya dapatkan. :)
AnBisw
5

Saya telah menemukan bahwa yang terbaik adalah mengubah judul pengontrol tampilan saat ini di tumpukan navigasi ke teks yang diinginkan dari tombol kembali sebelum mendorong ke pengontrol tampilan berikutnya.

Misalnya

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

Kemudian di viewDidAppear atur judul kembali ke judul yang diinginkan untuk VC asli. Voila!

OneInABajilian
sumber
5

Untuk Swift:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton
Ryan R
sumber
4

Saya telah menemukan, bahwa cara termudah untuk mengubah nama tombol kembali adalah dengan mengatur judul pengontrol tampilan ke judul tombol kembali, dan kemudian mengganti titleView di item navigasi pengontrol tampilan ke label khusus dengan itu nyata nama.

Seperti ini:

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

Ini akan membuat judul Anda di UINavigationBar terlihat seperti asli. Memberikan pengontrol tampilan kemampuan untuk memiliki judul terpisah dan judul tombol kembali.

Dalam kasus pengontrol tampilan A dan B, A bertanggung jawab untuk mengetahui bagaimana seharusnya tombol kembali, sementara B ditampilkan.

EDIT: Ini juga mempertahankan tampilan asli tombol kembali (Butir tombol bilah panah kiri).

Trenskow
sumber
4

Kode ini juga berfungsi. Letakkan ini di pengontrol root pengontrol navigasi:

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

Saya baru di iOS tapi saya akan memberikan jawaban yang sangat sederhana saya menimpa kelas pengontrol navigasi. Saya memiliki metode override push dan pop yang sederhana dan menyimpan judul controller tampilan sebelumnya. Maaf karena menempel di blok js. Agak bingung bagaimana melewatinya di blok kode normal.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end

Sergey Brazhnik
sumber
4

self.navigationController.navigationBar.backItem.title = @"TEXT";

Dan di Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
GS
sumber
3
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

Anda dapat meletakkannya di mana pun Anda suka dalam kode di parrent controller, yang memungkinkan Anda untuk memiliki tombol backbeda yang berbeda untuk tampilan anak yang berbeda.

chikuba
sumber
3

Sebagian besar solusi membunuh gaya asli BackButton (Tombol bar panah kiri) sambil menambahkan tombol biasa dengan judul yang diinginkan.
Jadi untuk mempertahankan gaya asli ada 2 cara:
1: Untuk menggunakan gaya tombol tidak berdokumen (110 atau sesuatu seperti itu) yang saya lebih suka tidak melakukan. Tetapi jika mau, Anda bisa menemukan cara melakukannya di sini, di stackoverflow.
2: Untuk menggunakan ide I the Trenskow. Saya menyukainya dan saya menggunakannya sedikit berubah.
Alih-alih menimpa - (NSString *) judul saya telah memutuskan untuk mempertahankan judul asli dengan cara berikut (yang memungkinkan saya untuk menggunakan judul nib dan diberi judul di push state btw).

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

Solusi ini berfungsi baik dan terlihat asli. Juga jika menggunakannya dalam metode viewDidLoad itu mencegah eksekusi lebih dari 1 kali.
Saya juga sudah mencoba solusi Jessedc tetapi terlihat buruk. Hal ini menyebabkan perubahan bar judul terlihat oleh pengguna dengan cepat dari aslinya ke BackButton yang diinginkan dan kembali.

Stan
sumber
2

Ini berfungsi bagi saya sebagai versi "sederhana" dari jawaban yang diposting sebelumnya.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Jangan lupa untuk meletakkan kode di dalam pengontrol tampilan induk (mis. Tampilan yang memiliki tampilan tabel atau UITableViewController), bukan tampilan anak atau detail (mis. UIViewController).

Anda dapat dengan mudah melokalisasi string tombol kembali seperti ini:

backButton.title = NSLocalizedString(@"Back Title", nil);
Lex L.
sumber
2

Kami memiliki dua VC A dan B.

Jika Anda ingin mengubah judul dalam B, tulis kode ini dalam A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)
iOS
sumber
1

Jawaban Stan adalah yang terbaik. Tapi itu juga memiliki masalah, ketika Anda menggunakan controller dengan Tab Bar dan mengubah judul controller, Anda juga bisa mengubah judul Tab Bar. .title dalam fungsi. Jawabannya ada di sini: (Dengan ARC dan menambahkannya ke viewDidLoad view)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

Dalam penggunaan saya sendiri, saya membuatnya menjadi fungsi seperti ini, hanya memiliki fitur dengan satu kode baris di viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}
jtianling
sumber
1

Jika Anda ingin tidak hanya mengubah teks dari tombol Kembali ke teks yang sama dan tetap menjadi bentuk panah kiri asli, tetapi juga untuk melakukan sesuatu ketika pengguna mengklik tombol Kembali, saya sarankan Anda untuk melihat-lihat " CustomNavigationController " saya. .

jianpx
sumber
1

MASALAH: Teks "Kembali" di bilah navigasi tidak dapat diganti.

ALASAN: Label "Kembali" diatur di bilah navigasi setelah mendorong tampilan karena atribut .title pada pengendali tampilan induk diatur ke nol (atau tidak diinisialisasi).

SATU SOLUSI: Jika Anda mengatur self.title = "Terserah ..." Anda akan melihat bahwa alih-alih "Kembali" akan muncul "Terserah ..." setelah mendorong pengontrol tampilan baru.

Javier Calatrava Llavería
sumber