Tombol kembali kustom UINavigationBar tanpa judul


231

Bagaimana cara menyesuaikan tombol kembali navigasi di iOS 7 dan di atasnya tanpa judul? (Yaitu dengan panah saja)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Saya hanya ingin tahu apakah mereka memiliki self.backButtonItem;

ATAU

sesuatu seperti ini?

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

3
Anda dapat menggunakan @hiroshi answer + bilah navigasi properti tintColor untuk membuat chevron dengan warna khusus dan tanpa judul apa pun
Dmitry Zhukov

Bagi mereka yang memiliki bilah tab, dan Anda tidak ingin teks tombol kembali, perbaikannya adalah: di viewDidLoad () dari TabBarController, masukkan: self.navigationItem.backBarButtonItem = UIBarButtonItem (judul: "", style:. polos, target: nihil, aksi: nihil)
Borzh

Jawaban:


313

Ini sebenarnya cukup mudah, inilah yang saya lakukan:

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

Cepat 2

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

Cepat 3

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

Letakkan baris ini di controller tampilan yang mendorong ke stack ( controller tampilan sebelumnya ). Tombol back view controller yang baru ditekan sekarang akan menampilkan apa pun yang Anda masukkan untuk initWithTitle, yang dalam hal ini adalah string kosong.


3
Saya menggunakan ini tetapi judulnya datang dan menghilang dengan cara animasi ??
user1010819

7
Terima kasih Kyle! Saya telah mencari cara untuk mengubah nama tombol kembali default di iOS 7. Saya meletakkan ini di prepareForSeguecontroller tampilan saya dan bekerja dengan sempurna.
Yiwei

1
@ user1010819 Ini adalah perilaku yang diharapkan, barButtonItems akan menghidupkan dan keluar saat beralih pengontrol tampilan. Apa yang ingin Anda capai?
Kyle Begeman

1
@YiweiGao Tidak masalah! Ini hanyalah salah satu dari hal-hal itu yang jika Anda tahu kode yang tepat, itu sangat sederhana! Saya senang itu membantu!
Kyle Begeman

3
Saya merasa seperti ini perlu pembaruan, hanya menunjukkan tidak ada sekarang, panah tidak ada di sana?
Mathijs Segers

198

Saya menemukan cara mudah untuk membuat tombol punggung saya dengan panah tunggal iOS.

Mari kita tambahkan bahwa Anda memiliki pengontrol navigasi menuju ke ViewA dari ViewB. Di IB, pilih bilah navigasi ViewA, Anda akan melihat opsi ini: Judul, Prompt dan Tombol Kembali.

Opsi bilah navigasi ViewA

Opsi bilah navigasi ViewA

Caranya adalah memilih judul tombol kembali takdir pengendali Anda (ViewB) di opsi pengendali tampilan sebelumnya (Lihat A). Jika Anda tidak mengisi opsi "Tombol Kembali", iOS akan menempatkan judul "Kembali" secara otomatis, dengan judul pengontrol tampilan sebelumnya . Jadi, Anda perlu mengisi opsi ini dengan satu ruang.

Isi ruang di opsi "Tombol Kembali"

Isi ruang di opsi "Tombol Kembali"

Hasil:

Hasil:


Selamat datang di Stack Overflow . Jika Anda belum, lihat apa yang kami tur , dan baca beberapa artikel di pusat bantuan tentang cara kami bekerja dan beberapa kebiasaan masyarakat di sini. Jika Anda memerlukan bantuan dengan fungsi situs, jangan takut untuk mencari, lalu ajukan pertanyaan di Meta Stack Overflow (jika Anda masih tidak dapat menemukan jawaban). Terima kasih, dan semoga berhasil! Bagaimanapun, Anda dapat memposting gambar Anda sekarang ... :)
Qantas 94 Heavy

53
berfungsi, cukup perhatikan - Anda perlu mengatur "Tombol Kembali" untuk pengontrol sebelumnya (mis. untuk rootViewController di pengontrol navigasi Anda)
evfemist

Pastikan Anda tidak memiliki "hidesBackButton" yang disetel ke TRUE pada item navigasi di ViewA
shim

Tampak bagi saya bahwa ini berfungsi jika judul pengendali yang menyajikan cukup panjang - jika itu judul pendek itu akan digunakan sebagai gantinya.
amergin

1
bagi saya itu hanya bekerja ketika kedua sumber dan tujuan ViewController ini NavigationItem telah Back Buttonditetapkan untuk karakter spasi tunggal (yaitu baik ViewA dan ViewB)
dcestari

72

Cukup gunakan gambar!

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

Icon-Back.png

Ikon-Kembali

Icon-Back@2x.png

Ikon-Kembali @ 2x

Icon-Back@3x.png

Ikon-Kembali @ 23x


4
Dengan solusi ini Anda tampaknya kehilangan fungsionalitas "gesek untuk kembali".
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selfmelakukan trik untuk menjaga gerakan menggesek kembali
Victor Carmouze

Saya sudah mencari jawaban ini, mungkin sepanjang hidup saya, yaitu pemilih tindakan.
Des

29

iOS7 memiliki aturan antarmuka baru, jadi lebih baik untuk menjaga setidaknya panah belakang saat Anda mendorong UIView. Sangat mudah untuk mengubah teks "kembali" secara terprogram. Cukup tambahkan kode ini sebelum mendorong tampilan (Atau mempersiapkanForSegue jika Anda menggunakan StoryBoards):

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

Ini akan mengubah teks "Kembali" default, tetapi akan menjaga panah kembali gaya iOS7. Anda juga dapat mengubah warna rona untuk panah belakang sebelum mendorong tampilan:

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

Semoga ini bisa membantu Anda!


2
Ini berfungsi sangat baik dan tampaknya lebih baik daripada opsi lain. Misalnya, judul tidak perlu diatur ulang ke nilai sebelumnya, tidak seperti beberapa jawaban lainnya.
pr1001

26

Tidak banyak yang perlu Anda lakukan. Anda dapat mencapai hal yang sama melalui storyboard itu sendiri.

Buka saja pengontrol Navigasi root dan beri ruang. Ingat bukan untuk pengontrol yang Anda inginkan tombol kembali tanpa judul, tetapi ke pengontrol navigasi root.

Seperti gambar di bawah ini.  Ini berfungsi untuk iOS 7 dan iOS 8


Saya sudah mencobanya, Ini berhasil. Tetapi saya masih tidak dapat mengubah judul dalam kode.
Yu-Lin Wang

Bekerja dengan XCode7, tetapi tidak berfungsi lagi di xCode8 -> ios10.X, saya telah menggunakan metode
@iwasrobbed

Semua genius itu sederhana!
Illya Krit

22

Sementara jawaban Kyle Begeman benar-benar berhasil, cukup menjengkelkan memiliki kode ini di setiap pengontrol tampilan. Saya akhirnya dengan UINavigationItemkategori sederhana . Waspadalah, ini naga! Maaf, maksud saya, berputar-putar:

#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
Saya terbalik tetapi kemudian memutuskan untuk menggunakan hack yang lebih sederhana sebagai gantinya - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( sumber ) - mungkin sedikit kurang elegan, tetapi swizzling terasa seperti berlebihan
dem

2
Serius, kalian semua ... jangan meneruskan solusi lain. Terapkan solusi @nicky yang diposting sebagai Kategori dan jangan berpikir dua kali. Ini adalah solusi hebat yang dapat digunakan kembali yang dapat diterapkan di seluruh aplikasi jika Anda menambahkan file Prefix.pch ini. Apple mendorong penggunaan kategori untuk menambahkan Metode ke Kelas yang Ada, Anda harus memanfaatkan ini jika memungkinkan.
zmonteca

Ini adalah solusi terbaik menurut saya, lagipula "method_exchangeImplementation" agak tidak aman, lihat ini: Cara yang tepat untuk meliuk - liuk dan panduan yang meliuk-liuk di NSHipster
Alessandro Orrù

@ AlessandroOrrù Dalam kasus khusus ini, ini harus aman karena metode swizzled adalah UINavigationItemmetode sendiri, tidak ada warisan yang terlibat. Dan _cmdsangat tidak mungkin untuk terlibat dalam rajin dan giat. Bagaimanapun juga, itu poin yang bagus. Jadi, Anda semua, jika Anda memiliki salah satu dari banyak pembantu yang berputar-putar di proyek Anda, pastikan Anda menggunakannya di sini juga.
secondcitysaint

21

EDIT: 2014-04-09: Ketika saya mendapatkan reputasi, saya merasa menyesal karena saya tidak menggunakan trik ini lagi. Saya merekomendasikan jawaban Kyle. Juga pemberitahuan bahwa selfdari self.navigationItem.backBarButtonItemtidak controller tampilan tombol kembali ditampilkan, tapi sebelumnya pengendali tampilan menjadi kembali.

Jika Anda tidak perlu memiliki teks judul untuk pengontrol tampilan sebelumnya, cukup isi judul dengan string kosong;

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

Ini akan mencegah menampilkan "kembali" dengan chevron pada pengontrol tampilan yang didorong.

EDIT: Bahkan Anda menggunakan teks judul non-kosong, mengatur judul pengontrol tampilan sebelumnya dalam viewWillAppear:karya kecuali judul dapat berkedip dalam berkedip ketika pengontrol tampilan muncul. Saya pikir "Aplikasi twitter" tampaknya melakukan peretasan yang lebih halus untuk menghindari flicker.


Satu-satunya masalah yang saya miliki di sini adalah ketika saya menekan bilah navigasi untuk kembali judul pada tampilan sebelumnya menjadi kosong. Ada jalan lain?
Alioo

@ Allioo Apakah Anda mencoba apa yang saya sebutkan di baris "EDIT"?
hiroshi

20

Ini berfungsi, tetapi itu akan menghapus judul item sebelumnya, bahkan jika Anda kembali ke sana:

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

Cukup setel properti ini pada viewDidLoadView Controller yang didorong.


17
Ini akan menghapus judul item sebelumnya, bahkan jika Anda muncul kembali. Tidak terlalu bagus :(
Antzi

Saya mengatur judul VC mendorong viewWillAppearsehingga selalu diatur dengan benar.
Guto Araujo

@GutoAraujo Berhasil tetapi judulnya kembali muncul dengan 1 atau 2 detik penundaan penyihir membuat UX tidak sebagus itu.
fuiiii

Dalam xCode8 -> ios10.X ini tampaknya menjadi satu-satunya cara untuk mengatasi masalah ini
LucioB

12

Ini adalah bagaimana saya melakukannya dan yang paling sederhana, berfungsi dan cara yang paling jelas untuk melakukannya.

Ini berfungsi jika menanamkan Navigation Controller

Cepat 3

Di viewDidLoadSaya menambahkan ini ke View Controller Anda ingin tombol kembali menjadi hanya panah.

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

Perbedaannya dengan jawaban @Kyle Begeman adalah bahwa Anda memanggil ini pada pengontrol tampilan yang Anda inginkan tombol kembali hanya panah, bukan pada pengontrol tampilan tumpukan mendorong.


7

Anda tidak memiliki akses ke backButtonItem navigasi dengan cara yang Anda inginkan, Anda perlu membuat tombol kembali sendiri seperti di bawah ini:

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

Dan tentu saja:

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

kemudian kami kehilangan animasi fade out yang bagus yang terjadi di tombol kembali
Kiddo

3
Anda memerlukan topeng untuk transisi yang mulus. "* Jika Anda ingin menggunakan gambar khusus untuk mengganti chevron default, Anda juga perlu membuat gambar topeng kustom. IOS 7 menggunakan topeng untuk membuat judul layar sebelumnya muncul muncul dari — atau menghilang ke dalam - chevron selama navigasi transisi. "
pengguna

3
@null Anda akan kehilangan gerakan gesekan sisi-ke-sisi dari iOS 7!
Mazen Kasser

@ Pengguna Saya mendapatkan gambar khusus tetapi warna warna biru secara default. Bagaimana saya tidak bisa menambahkan warna? terima kasih
Mazen Kasser

7

Target: menyesuaikan semua tombol kembaliUINavigationBarke ikon putih

Langkah-langkah: 1. dalam metode "didFinishLaunchingWithOptions" di AppDelete :

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.dalam viewDidLoadmetode ViewControllerkelas super umum :

 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
    }

Ini menunjukkan peringatan "Versi implisit SYSTEM_VESION _..." tidak valid di C99.
Jayprakash Dubey

7

SWIFT 4

Bagi mereka yang ingin membuat tombol kembali kustom serta judulnya dihapus, gunakan kode berikut di dalam pengontrol tampilan yang mendorong yang baru:

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)

Untuk penggunaan yang lebih universal, lakukan hal berikut:

  1. Buat fungsi universal sebagai berikut:

    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. Kemudian gunakan dalam tampilan pengontrol sebagai berikut:

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

6

Retasan sederhana dari iOS6 juga berfungsi di iOS7:

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

Sunting: Jangan gunakan peretasan ini. Lihat komentar untuk detailnya.


6
Jangan gunakan retasan ini. Ada bug dalam kode Apple pada perangkat 64 bit yang akan mencegah tampilan modal muncul ketika Anda membuat judul tombol bar diimbangi. Lebih detail .
zh.

Yah hanya ada masalah pada perangkat, bukan simulator.
zh.

Peretasan ini tidak lagi berfungsi ketika dibuat dengan Xcode 9 / iOS 11. "<" akan tampak terlalu rendah dan Anda akan melihat kendala yang rusak saat dijalankan di debugger.
T'Pol

3

Anda bisa menggunakan ini. Ini berfungsi sempurna bagi saya dengan hanya menambahkan UIButtonsebagai custumview untuk UIBarButtonItem.

Coba Kode Di Bawah Ini

    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
Namun, ini akan menonaktifkan gesture gesek kembali di iOS 7
user102008

3

Buat UILabeldengan judul yang Anda inginkan untuk pengontrol tampilan root dan tetapkan ke pengontrol tampilan navigationItem.titleView.

Sekarang atur judul menjadi string kosong dan pengontrol tampilan berikutnya yang Anda tekan akan memiliki tombol kembali tanpa teks.

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

Semua jawaban tidak menyelesaikan masalah. Tidak dapat diterima untuk mengatur judul tombol kembali di setiap pengontrol tampilan dan menambahkan offset ke judul masih membuat judul Pengendali Tampilan berikutnya bergeser ke kanan.

Berikut adalah metode menggunakan metode swizzling, cukup buat ekstensi baru ke UINavigationItem

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

Atur kembali tombol ke kata kembali, berfungsi dengan baik: self.navigationItem.backBarButtonItem.title = @ "Kembali";
Mike Zriel

Apa maksudmu sobat? Pertanyaannya adalah tentang menghapus teks dari tombol kembali?
jakub wolanski

1
Banyak Aplikasi dan Aplikasi milik Apple mengatakan "<Kembali", jadi bagus untuk tetap pada standar. BigTakeAway dan JustEat.
Mike Zriel

2

Saya menerapkan kode berikut di viewDidLoad dan berfungsi:

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

Hanya untuk memperbarui saya menggunakan Ikon Vektor


2

Anda dapat subkelas UINavigationController, menetapkan dirinya sebagai delegate, dan mengatur backBarButtonItem dalam metode delegate 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

Setel kembali judul kosong

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

Ubah kembali gambar

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

1

Saya telah menggunakan solusi ini sejak iOS 5 atau lebih tanpa masalah. Saya membuat fungsi utilitas yang saya panggil di pengontrol tampilan saya. Anda harus melakukannya di viewDidLoad atau titik mana pun setelah itu.

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

Dalam beberapa kasus, item navigasi mungkin sudah ada, dalam kasus lain itu perlu dibuat. Akun ini untuk kedua kasus tersebut tanpa mengacaukan judul item navigasi. Ini memungkinkan Anda untuk menghapus judul hanya dengan lewat @"".


1
Ini jawaban yang benar. Tidak ada trik. Ini hanya menggunakan API iOS seperti yang seharusnya digunakan, untuk mengatur judul. Setel ke @ "" untuk menghapus judul (diuji dan berfungsi dengan baik).
n13

1

Satu-satunya cara yang berhasil bagi saya adalah:

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

MEMPERBARUI:

Ketika saya mengubah bendera animasi segue menjadi true (Itu salah sebelumnya), satu-satunya cara yang bekerja untuk saya adalah:

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

1

Jika Anda memiliki dua ViewController (FirstVC, SecondVC) Embed di Navigasi Controller, dan Anda ingin hanya ada panah kembali di SecondVC.

Anda dapat mencoba ini di ViewDidLoad FirstVC

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

Kemudian ketika Anda mendorong ke SecondVC, Anda akan melihat hanya ada panah kembali


1

Jika Anda mengatur tintColor Of NavigationBar, tambahkan gambar tombol kembali kustom tanpa judul yang warna tint akan mencerminkan warna gambar. Silakan ikuti tautan apple documentaion ini.

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

Saya menulis ekstensi untuk mempermudah ini:

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

Anda dapat mengubah judul menjadi @ "" dari ViewController saat ini di viewWillDisappear, dan ketika akan ditampilkan lagi, atur ulang judul ke apa pun sebelumnya.

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

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

0

Dalam metode prepForSegue: pada ViewController pertama Anda, Anda menetapkan judul view ke @ "", jadi ketika tampilan berikutnya didorong, ia akan menampilkan judul ViewController sebelumnya yang akan menjadi @ "".

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

Satu-satunya masalah dengan ini adalah ketika Anda menekan tombol kembali tampilan Anda sebelumnya tidak akan memiliki judul, jadi Anda dapat menambahkannya lagi di viewWillAppear:

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

Saya tidak terlalu suka solusi ini tetapi ini berhasil dan saya tidak menemukan cara lain untuk melakukannya.


Lihat jawaban saya untuk solusi yang benar tanpa mengacaukan judul item navigasi.
Dima

Apakah solusi Anda menjaga panah belakang iOS7? Saya mencoba sesuatu yang serupa tetapi menghapus panah.
Alejandro Figueroa

Itu membuat panah kembali di iOS 7, ya. Di iOS 6 lewat string kosong (0 panjang) juga akan menghapus tombol sepenuhnya, jadi melakukan ini hanya benar-benar baik untuk iOS 7.
Dima

Ada solusi yang sangat sederhana. Lihat apakah jawaban saya cocok untuk Anda.
Guto Araujo

0

Untuk menambah jawaban Thomas C di atas, terkadang menempatkan satu ruang tidak berfungsi dan Anda harus terus menambahkan ruang.

tombol bar kosong

Anda akan tahu bahwa Anda berhasil ketika Anda melihat "Item Tombol Bar -" di bawah "Item Navigasi". Itu ada di Document Outline (Editor-> Show Outline Dokumen). Setelah Anda melihat gambar di atas, Anda dapat menghapus beberapa spasi dan melihat apakah masih berfungsi.


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

Seperti halnya Kyle Begeman, Anda menambahkan kode di atas pada pengontrol tampilan root. Semua pengontrol tampilan sub akan diterapkan. Selain itu, menambahkan ini dalam metode initWithCoder:, Anda dapat menerapkan gaya untuk pengontrol tampilan root dalam pendekatan berbasis xib, storyboard atau kode.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.