Teks khusus "tombol kembali" UINavigationController?

147

"Tombol kembali" secara UINavigationControllerdefault menunjukkan judul tampilan terakhir di tumpukan. Apakah ada cara untuk memiliki teks khusus di tombol kembali?

Ali Shafai
sumber
1
Ini berfungsi untuk sayaself.navigationController.navigationBar.topItem.title = @"Custom text";
huync

Jawaban:

342

Dari tautan ini :

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

Seperti yang dikatakan Tyler dalam komentar:

jangan lakukan ini di pengontrol tampilan yang terlihat, tetapi di pengontrol tampilan yang akan Anda lihat jika Anda menekan tombol kembali

kendali
sumber
4
Anda harus releaseyang UIBarButtonItem.
Mehrdad Afshari
217
Perhatikan juga, Anda perlu melakukan ini di view controller satu tingkat di atas tumpukan. Dengan kata lain, jangan lakukan ini di pengontrol tampilan yang terlihat, tetapi di pengontrol tampilan yang akan Anda lihat jika Anda menekan tombol kembali.
Tyler
6
Hanya untuk mengklarifikasi komentar Tyler karena saya tidak mengerti ini pada awalnya: Mengatur backBarButtonItem dalam tampilan pengontrol navigasiItem sedang mengatur tombol yang akan menunjukkan untuk KEMBALI ke pengontrol tampilan ini. Perhatikan juga bahwa meskipun tidak ada gaya tombol untuk tombol panah, tombol ini tetap akan mendapatkan gaya panah. Saya telah menggunakan UIBarButtonItemStylePlain dan masih mendapatkan gaya tombol panah.
Jon Steinmetz
3
Saran: Daripada menganggap gaya, sampaikan gaya yang saat ini ditetapkan. Dalam kode jawaban ini, ganti UIBarButtonItemStyleBordereddengan panggilan ke properti self.navigationItem.backBarButtonItem.style. Dokumentasi: developer.apple.com/library/ios/documentation/uikit/reference/…
Basil Bourque
1
Perhatikan bahwa di bawah ARC Anda harus meninggalkan panggilan autorelease. sehingga Anda memiliki self.navigationItem.backBarButtonItem = [[Alokasi UIBarButtonItem] initWithTitle: @ "Judul Kustom" gaya: UIBarButtonItemStyleBordered target: nil action: nil];
bkbeachlabs
43

Anda dapat mengatur teks di Pembuat Antarmuka:

Pilih item navigasi pada ViewController yang akan dikembalikan oleh tombol kembali:

masukkan deskripsi gambar di sini

Di inspektur atribut panel utilitas, masukkan label Anda untuk Tombol Kembali:

masukkan deskripsi gambar di sini

Saya lebih suka pendekatan ini daripada menetapkan judul dalam kode seperti pada jawaban yang diterima.

Perhatikan juga, Anda perlu melakukan ini di view controller satu tingkat di atas tumpukan. Dengan kata lain, jangan lakukan ini di pengontrol tampilan yang terlihat, tetapi di pengontrol tampilan yang akan Anda lihat jika Anda menekan tombol kembali.
--Tyler

Petr Peller
sumber
Ini adalah jawaban terbaik yang saya temukan sejauh ini.
Ayan Sengupta
2
Agar jelas, ini harus ditetapkan pada Item Navigasi pengontrol tampilan, bukan pada inspektur atribut pengontrol tampilan itu sendiri.
Patrick Baca
Ini jawaban terbaik yang saya temukan.
bicepjai
Ini adalah jawaban terbaik
Alex Brown
2
Pada Xcode 6.1.1, dan berjalan di iOS 7, tampaknya judul tampilan asli Anda sebelumnya akan MASIH menimpa judul tombol kembali apa pun yang Anda tetapkan di sini. Jika judul tampilan sebelumnya berisi lebih dari batas 11 karakter, maka tombol kembali tampilan berikutnya hanya akan mengatakan "Kembali". Tidak ada jalan lain kecuali membuat item bar nav baru dari awal seperti yang ditunjukkan pada jawaban pilihan-atas di sini.
ray
22

Saya menggunakan ini:

// 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";
}
Trang
sumber
Ini hampir berfungsi untuk saya, tetapi ketika saya mengklik tombol kembali, teks tersebut berubah kembali ke judul induk selama durasi animasi :-(
Danny Tuppeny
3
Ini mengubah judul tombol Kembali dari pengontrol di tumpukan. Itu tidak mengubah judul tombol Kembali dari pengontrol yang ditampilkan saat ini. Lebih buruk lagi: itu mengubah judul controller sebelumnya ke controller sebelumnya!
leviathan
Seperti dicatat oleh komentator lain, metode ini sedikit tidak bisa dipertahankan. Saya tidak akan merekomendasikan melakukan ini karena sebenarnya bukan bagaimana API bermaksud Anda untuk menggunakannya. Anda bisa mengatur diri sendiri untuk bug yang sulit di masa depan!
RickDT
11

Saya menemukan solusi praktis untuk ini dengan hanya mengatur judul controller sebelum mendorong controller lain ke stack, seperti ini:

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

Kemudian, pastikan untuk mengatur judul aslinya viewWillAppear, seperti ini:

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

Ini berfungsi karena perilaku default UINavigationControllerketika membangun tombol kembali selama operasi push adalah dengan menggunakan judul dari pengontrol sebelumnya.

Aubrey Goodman
sumber
1
Masalah dengan ini adalah perubahan judul pada tampilan lama saat menjiwai dan terlihat agak aneh. Tak satu pun dari solusi yang diberikan di sini tampaknya berfungsi seperti yang Anda inginkan :-(
Danny Tuppeny
1
Ini sempurna dalam situasi saya karena saya tidak menunjukkan NavBar di layar sebelumnya dan saya hanya ingin menghapus titleLabel dari tombol kembali di layar baru dan hanya memiliki panah chevron iOS7. Karena itu saya hanya dapat mengatur literal NSString kosong untuk judul.
siburb
mendorong pengontrol tampilan memunculkan pengecualian saat mengetuk di belakang
Sumit
7

Judul tombol kembali secara default ke judul tampilan sebelumnya sehingga trik cepat yang saya gunakan adalah menempatkan kode berikut pada file .m tampilan sebelumnya.

-(void)viewWillAppear:(BOOL)animated {

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

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}
AddisDev
sumber
Ini bekerja cukup baik untuk banyak kasus dan cukup sederhana ... hanya pengamatan yang mengesampingkan salah satu metode ini yang mengharuskan implementasi super dipanggil pada beberapa titik dalam metode baru.
izk
2
Dengan metode ini, orang akan melihat judul tampilan induk diubah menjadi 'Kembali' sebelum animasi push terjadi. (Dan, agak menyebalkan, bahwa jika Anda memindahkan ini ke metode viewDidDisappear, Anda akan melihat saklar terjadi setelah push ..)
James Boutcher
Saya suka metode ini tetapi masalah yang saya hadapi dengan ini adalah bahwa "Judul Asli" akan ditetapkan baik-baik saja tetapi disertai dengan ellipsis jika lebih panjang dari "Kembali" yang pasti karena, karena tampilan belum dalam hierarki tampilan , itu tidak menyampaikan tampilan judul. Masalah yang dijelaskan oleh @JamesBoutcher di atas tidak terlalu mencolok bagi saya karena kecepatan awal animasi yang cepat. Bahkan, saya baru menyadari bahwa masalah yang saya hadapi sangat terasa karena animasi yang lambat saat itulah masalah ini menonjol.
trss
Sementara jawaban di stackoverflow.com/questions/1441699/… terasa lebih seperti penyesuaian daripada yang diperlukan, itu adalah cara yang terdokumentasi dan yang lebih penting tampaknya lebih selaras dengan maksud kami.
trss
6

dalam metode init Anda, tambahkan kode berikut:

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

kemudian tambahkan metode sederhana, untuk memungkinkan pemecatan viewcontroller:

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

Tambahkan kode berikut di viewDidLoad atau loadView

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

Saya mengujinya di iPhone dan iPad dengan iOS 9

sendirian
sumber
Harus self.navigationController? .NavigationBar.backItem? .Title = "Teks Kustom"
Peacemoon
1
satu-satunya perbedaan yang saya butuhkan adalah navigationControllertopItemself.navigationController?.navigationBar.topItem?.title = "Custom Text"
rantai
2

Menambah jawaban rein. Perhatikan dari dokumen Apple bahwa deklarasi backBarButtonItem adalah ini:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Oleh karena itu, jawaban rein akan membocorkan memori karena setter yang disintesis akan retainmembuat Anda lulus begitu saja, yang tidak pernah dirilis secara eksplisit. Anda dapat memperbaiki ini dengan menggunakanautorelease

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

Atau Anda bisa mengarahkan variabel pada instance sehingga Anda dapat secara eksplisit melepaskannya nanti:

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

Semoga ini membantu!

Eric Goldberg
sumber
Perhatikan hari ini, dengan ARC, Anda tidak perlu khawatir tentang autorelease (dan memang kompiler akan kesalahan jika Anda mencoba untuk autorelease dalam proyek yang diaktifkan ARC)
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];
}
LCANT
sumber
2

Saya telah menemukan sesuatu yang menarik. Jika Anda mensubclass UINavigationControllerdan menimpa pushViewController:animated:metode dan melakukan sesuatu seperti ini: (ingatlah bahwa saya menggunakan ARC)

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

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

Kemudian untuk semua ViewControllersyang didorong dengan pengontrol navigasi Anda akan memiliki tombol "Kembali" di dalamnya secara otomatis. Jika Anda ingin mengubah teks untuk pengontrol tampilan tertentu, Anda dapat mencoba dan mungkin melemparkan viewcontroller ke kelas tertentu atau protokol kustom Anda sendiri (yang diturunkan dari viewcontroller Anda yang dapat memiliki metode seperti backButtonTextatau sesuatu yang konyol seperti itu) yang dapat memberi Anda informasi tertentu pada viewcontroller yang datang dengan begitu Anda dapat menyesuaikan teks tombol kembali untuk itu. Sekarang teks tombol kembali diurus di tempat yang seharusnya hanya memikul tanggung jawab. Saya harus mengakui bahwa membuat tombol baru untuk mengubah teks menyebalkan, tapi oh well.

Adakah yang bisa memikirkan alasan mengapa tidak melakukannya seperti ini? Setidaknya Anda tidak perlu mengutak-atik judul viewcontroller atau harus ingat untuk membuat tombol kembali baru sebelum mendorong viewcontroller pada pengontrol navigasi.

Dandré
sumber
0

jawaban rein bekerja dengan baik.

Perhatikan bahwa jika Anda menekan lebih dari satu pengontrol tampilan, judul tombol kembali yang diubah akan muncul untuk masing-masing, yang mungkin bukan yang Anda inginkan.

Dalam hal ini, Anda harus membuat UIBarButtonItem khusus setiap kali Anda mendorong pengontrol tampilan.

Juga, pastikan Anda melakukannya sebelum mendorong pengontrol tampilan, jika tidak, Anda akan mendapatkan cegukan layar saat judul berubah.

orang utara
sumber
0

Memperluas saran Aubrey, Anda bisa melakukan ini di pengontrol tampilan anak:

buat dua variabel untuk menyimpan nilai lama dari navigationItem.title orang tua dan navigationItem orang tua

UINavigationItem* oldItem;
NSString* oldTitle;

di viewDidLoad, tambahkan berikut ini:

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

di viewWillDisappear, tambahkan berikut ini:

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

Itu tidak sempurna. Anda akan melihat judul perubahan tampilan induk saat controller baru dianimasikan. TETAPI ini memang mencapai tujuan untuk memberi label kustom pada tombol kembali dan menjaganya agar tetap berbentuk seperti tombol kembali standar.

FingerTipFun
sumber
0

Masukkan ini ke dalam diri Anda viewDidLoad, berharap itu akan menghasilkan apa yang Anda cari

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

jika Anda ingin mengatur judul di ARRIVING controller (terkadang lebih banyak logika ..) di swift 3 lakukan:

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

}

dalam controller mendatang:

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

biasanya saya meletakkan self.setBackButtonNavBar di ekstensi pengontrol.

ingconti
sumber
0

Saya tahu ini adalah pertanyaan lama dan jawabannya sudah habis!

Cara mudah adalah dengan melakukan ini di induk ViewController:

yaitu salah satu yang membawa Anda ke pengontrol tampilan berikutnya.

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

Melakukan ini dalam kode menghapus gaya tombol kembali UINavigationConroller. Jika Anda menambahkan Item Navigasi di setiap tampilan Anda, Anda dapat mengatur judul botton belakang di menu StoryBoard.

gjseminario
sumber