Hapus teks dari tombol Kembali dengan menjaga ikon

96

Saya ingin menghapus teks dari tombol kembali, tetapi saya ingin mempertahankan ikonnya. saya telah mencoba

let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton

Namun, ini sepenuhnya menghapus teks dan ikon.

lmiguelvargasf
sumber

Jawaban:

99

Metode @ rmd2 hampir benar, tetapi sebaliknya Anda harus memilih bilah navigasi pengontrol yang akan dituju tombol kembali dan mengetik " "di bidang Tombol Kembali.

masukkan deskripsi gambar di sini

m8labs
sumber
1
cara terburuk, jika viewcontroller tidak memiliki bilah navigasi, saya harus menambahkan untuk menghapus teks
Daniel Beltrami
144

Saya tahu ini sudah ada jawabannya, tetapi Anda juga dapat melakukannya dalam kode (jika Anda bekerja dengan ujung pena)

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

Tambahkan di atas pada pengontrol tampilan pertama.

Perhatikan bahwa Anda perlu melakukan ini untuk setiap pengontrol tampilan yang mendorong. Jadi jika Anda memiliki 3 pengontrol tampilan, dan Anda ingin menghapus teks belakang dari semuanya, Anda harus menambahkan baris dalam pengontrol tampilan 1 dan 2.

d9rad
sumber
5
Ini adalah solusi terbaik yang saya lihat sejauh ini tidak memberi saya masalah
lostAtSeaJoshua
5
.Plaindiubah menjadi .plain. Tanpa huruf kapital p.
Gal
Sempurna..! Itu yang saya mau.
JD.
Solusi terbaik. Terima kasih.
Baran Emre
1
@ GastónAntonioMontes, tidak bekerja pada iOS13, tapi counter sedikit intuitif: judul kosong backBarButtonItem harus dinyatakan pada mendorong controller tampilan, bukan mendorong satu
Martin
51

Setelah banyak mencari, saya menemukan solusi terbaik dan sederhana, ini akan memengaruhi semua viewControllers yang ditulis di Swift 4.2 dan juga bekerja di Swift 5

extension UIViewController {
    open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }  
}
iOS Lifee
sumber
Selamat datang @ e.dimitrow
iOS Lifee
1
Bekerja seperti pesona
Jerry Okafor
5
Perhatikan bahwa ini hanya akan berfungsi jika ViewController Anda terdapat dalam Storyboard atau Nib ...
Nathaniel Blumer
1
Solusi jenius!
WM
3
Ini dulu berfungsi untuk saya, tetapi tidak lagi (masih berfungsi di simulator iOS 12, hanya saja iOS 13 terbaru) ...
tanya
37

Teks tombol kembali bergantung pada judul tampilan master.

Triknya adalah dengan menghapus judul jika tampilan master menghilang dan menyetelnya lagi jika ditampilkan lagi:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // needed to clear the text in the back navigation:
    self.navigationItem.title = " "
}

override func viewWillAppear(_ animated: Bool) {
   
    super.viewWillAppear(animated)
    self.navigationItem.title = "My Title"
}
Stefan
sumber
33

Jika Anda ingin menghapus judul sebuah tombol kembali dari mendorong controller tampilan, katakanlah <Settingsuntuk <di subSettingsViewController maka Anda sudah mengatur backBarButtonItem gelar di SettingsViewController ini viewWillDisappear () metode.

Objective-C:

- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}

Cepat:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Muhammad Umair
sumber
1
.Plaindiubah menjadi .plain. Tanpa huruf kapital p.
Gal
1
Jawabannya perlu diperbarui untuk perilaku searchController. Misalnya, jika Anda menggunakan resultVC terpisah dan mengetuk item yang mendorong VC lain, metode viewWillDisappear dari searchController awal tidak dipanggil, oleh karena itu judulnya masih ada
H4Hugo
Ini bukan pendekatan yang baik jika Anda mencari solusi untuk layar di seluruh aplikasi. - Jika Anda menambahkan kode ini ke beberapa "Pengontrol Tampilan Basis", viewWillDisappear dari pengontrol tampilan pertama akan dipanggil setelah viewDidAppear dari pengontrol tampilan kedua (di mana Anda biasanya mengatur judul) ... ini akan mengacaukan judul. Cara terbaik adalah dengan menimpa tombol kembali
Mithra Singam
Solusi Sempurna Terima kasih
SURESH SANKE
28

Jika Anda ingin panah kembali, maka kode berikut dimasukkan ke dalam file AppDelegate ke dalam metode didFinishLaunchingWithOptions.

Untuk Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
Pradeep Bishnoi
sumber
2
Saya suka yang ini karena Anda dapat menstandarkan gaya aplikasi Anda dalam satu file dan memanggilnya sekali dari delegasi aplikasi
Aaronium112
4
Ini benar-benar solusi yang bagus dan cepat, Tapi ... ini bisa menjadi rumit jika Anda memiliki item tombol bar lain kecuali yang di belakang
:)
3
Satu pengamatan, jika Anda hanya menerapkan atribut ".normal", Anda akan melihat teks saat diklik. Tambahkan baris yang sama untuk ".selected", ".highlighted", dan ".disabled." untuk memastikan Anda tidak melihat teks kedipan.
Nick N
1
Saya rasa ini akan memiliki efek samping, tombol batang lain selain tombol kembali juga akan terpengaruh dan akan memiliki warna teks yang jelas :(
dhin
24

Dalam kasus saya, untuk ikon dan judul khusus, ini berhasil (Swift 4)

    let imgBack = UIImage(named: "ic_back")

    navigationController?.navigationBar.backIndicatorImage = imgBack
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack

    navigationItem.leftItemsSupplementBackButton = true
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)
Rafiqul Hasan
sumber
1
baris terakhir dalam kode itu bekerja dengan sempurna untuk saya. Semua saran lain tidak berfungsi, mungkin karena pengontrol tampilan saya semuanya dikontrol oleh pengontrol nav. Dalam hal ini, navigationController? sangat dibutuhkan.
Salx
Anda memerlukan empat baris teratas jika ingin menambahkan tombol kembali kustom. Jika tidak, baris terakhir akan berhasil.
Rafiqul Hasan
14

Saya memecahkan masalah ini dengan menambahkan "" pada Judul Papan Cerita dari ViewController sebelumnya. Cuma spasi, tidak kosong; D

masukkan deskripsi gambar di sini

rmd2
sumber
Saya membutuhkan layar sebelumnya untuk memiliki judul, jadi saya rasa itu tidak akan berhasil untuk saya.
lmiguelvargasf
2
Saya telah kehilangan gelar itu tetapi gelar masih datang dengan tombol kembali
Himali Shah
1
jangan kosongkan Judul, bidang, letakkan "" (spasi) di bidang Tombol Kembali
Kiril S.
13

Akhirnya ditemukan solusi yang tepat.

Cukup tambahkan satu Gambar transparan dan tambahkan kode berikut di AppDelegate Anda.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Lalit Kumar
sumber
1
Ini pasti jawaban terbaik. Saya sebelumnya menggunakan UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustmentretasan yang paling direkomendasikan oleh jawaban lain, tetapi itu rusak di iPhone X untuk pengontrol tampilan dengan judul yang panjang. Solusi ini bekerja dengan sempurna.
Ned
3
Jawaban Terbaik. Berfungsi lebih baik daripada warna teks transparan.
William T.
1
Solusi terbaik yang saya gunakan dalam 4 tahun terakhir! Anda melakukannya sekali, di satu tempat dan untuk semua viewcontrollers !!!
korgx9
1
Ketika saya mencoba ini dengan iOS 12, teksnya masih muncul di sebelah gambar. :(
Sean McMains
13

dengan cepat 4

self.navigationController?.navigationBar.topItem?.title = ""
Amalendu Kar
sumber
Terima kasih, ini membantu saya, (Swift 4.0, Xcode 10.1, iOS 12.1.1), terima kasih
infinity_coding7
3
TAPI, Anda akan kehilangan gelar Anda di induk vc
Wei Lu
1
Jika ada judul besar maka topItem adalah largeTitle. Tidak berfungsi
Saranjith
11

Ini bekerja untuk saya

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
RomanV
sumber
1
Yang benar. Di iOS 13, navigationItem.backBarButtonItem tidak berfungsi. Ini menghemat jam kerja saya. Terima kasih
Manish
10

Untuk Swift 4+, masukkan baris-baris ini AppDelegatedididFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
BilalReffas
sumber
Saat Anda menyetel tampilan dalam delegasi aplikasi, warna latar depan yang jelas untuk setiap UIBarButtonItem, bukan? Jadi jika saya menambahkan UIBarButtonItem dengan teks, apakah saya harus mengubah warna latar depan untuk tombol ini secara manual?
kuzdu
1
Ini bagus tetapi ketika Anda menekan tombol kembali itu masih menampilkan teks
William T.
Ini berfungsi tetapi membuat tombol bar lain menghilang di iOS 11. Jawaban dari Rafiqul Hasan di atas dapat memperbaiki masalah
huync
6

Jika Anda memiliki ViewControllerA dan ingin menavigasi ke ViewControllerB, di ViewControllerA, Anda harus menyetel navigationItem saat ini dengan UIBarButtonItem baru dan judul ke string dengan spasi kosong sebelum mendorong ke pengontrol tampilan lain:

Setel judul menjadi string dengan spasi kosong, Anda tidak dapat menyetel nol atau "" (string kosong) karena nilai defaultnya adalah nihil

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)
Bradley
sumber
Saya mendapatkan perilaku yang sangat lucu dengan teks "Kembali" muncul kembali bahkan ketika judul disetel ke "" (dan diperiksa seperti itu) di ViewControllerB(meskipun itu selalu berhasil sampai sekarang, dengan kasus tepi khusus saya), ini satu-satunya solusi yang berhasil untuk saya
10623169
6

Letakkan kode ini di setiap VC yang mendorong satu sama lain

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Polina Hill
sumber
3
let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)

self.navigationItem.leftBarButtonItem = barButton

func backButtonPressed(btn : UIButton) {

    // Your code
}
Hasya
sumber
3

Untuk menghapus dari semua viewcontrollers di tumpukan pengontrol navigasi:

subclass UINavigationController dan tambahkan ini:

override func show(_ vc: UIViewController, sender: Any?) {
    setEmptyBackButton(vc)
    super.show(vc, sender: sender)
}

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    setEmptyBackButton(viewController)
    super.pushViewController(viewController, animated: animated)
}

func setEmptyBackButton(_ viewController: UIViewController) {
    viewController.navigationItem.backBarButtonItem =
        UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Gaston Gonzalez
sumber
2

Kadang-kadang tidak berhasil hanya mengubah warna judul, jika judulnya panjang. Karena itu mungkin menggeser judul bilah navigasi ke kiri. Jadi untuk mencegahnya, Anda mungkin perlu menggeser judul tombol bar secara horizontal untuk membuatnya transparan:

let barButtonItemAppearance = UIBarButtonItem.appearance()
    barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
Max Niagolov
sumber
2

Detail

  • Xcode Version 10.2.1 (10E1001), Swift 5

Larutan

1. Buat kelas kustom UINavigationController

import UIKit

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

2. Tambahkan ekstensi UIViewController

import UIKit

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

3. Perbarui kelas ViewController Anda

import UIKit

class ViewController: UIViewController {
    override var navigationItemBackButtonTextIsHidden: Bool { return true }
}

Sampel lengkap

import UIKit

// MARK: - ViewController

class ViewController: UIViewController {

    var screenCounter = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationItem()
    }

    override var navigationItemBackButtonTextIsHidden: Bool { return (screenCounter % 2) == 0 }
}

extension ViewController {

    private func setupNavigationItem() {
        navigationItem.title = "VC \(screenCounter)"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "push", style: .plain, target: self, action: #selector(pushBarButtonTouchedUpInside))
    }

    @objc func pushBarButtonTouchedUpInside(button: UIBarButtonItem) {
        guard let navigationController = navigationController else { return }
        let viewController = ViewController()
        viewController.screenCounter = screenCounter + 1
        viewController.view.backgroundColor = .white
        navigationController.pushViewController(viewController, animated: true)
    }
}

// MARK: - NavigationController

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

// MARK: - UIViewController extension

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

Hasil

masukkan deskripsi gambar di sini

Bodnarchuk dengan mudah
sumber
2

Anda dapat menghapus teks dari tombol kembali menggunakan metode delegasi UINavigationController.

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

}

extension CustomNavigationController: UINavigationControllerDelegate {
    
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: String(), style: .plain, target: nil, action: nil)
    }
    
}
keval
sumber
1

Bagi saya ini berhasil:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    self.navigationItem.title = " "
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationItem.title = "my amazing title"
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

Perhatikan bahwa jika Anda hanya menyetel judul tanpa mengubah backBarButtonItem, ini akan tampak berfungsi. Tetapi jika Anda mencoba untuk kembali menggunakan isyarat dan kemudian membatalkan dan tetap pada pengontrol tampilan yang didorong, judul belakang akan kembali.

Bekerja di Swift 4

mrc
sumber
Bisakah Anda menjelaskan?
mrc
Saya memiliki pengontrol yang selalu menampilkan teks Kembali dengan tombol kembali. Jadi kode di atas tidak berfungsi dalam kasus saya
Shahbaz Akram
1

Anda harus memilih bilah navigasi dari pengontrol FROM yang akan dituju tombol kembali dan ketik "" di bidang Tombol Kembali.

misalnya jika Anda mendorong pengontrol A ke pengontrol B, letakkan spasi di bilah navigasi pengontrol.

Tushar Raikwar
sumber
1

Xcode 10, Swift 4+

Jawaban serupa dengan yang lain di sini tetapi perlu dicatat bahwa jika teks masih belum dihapus, Anda harus mengklik Spasi lalu Enter.

masukkan deskripsi gambar di sini

Aishat Olowoshile
sumber
1

Salah satu alternatif untuk menimpa semua ViewControllersbagi saya adalah untuk memperpanjang UINavigationControllerdan mengatur backBarButtonItemdari topViewController.

Swift 5 di Xcode 11.2.1:

extension UINavigationController {
    override open func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let backButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        self.topViewController?.navigationItem.backBarButtonItem = backButton
    }
}
Sial
sumber
1

Cara termudah untuk melakukan ini secara terprogram adalah dengan menyetel backBarButtonItemdari pengontrol tampilan induk (pengontrol yang memanggil push).

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

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

Lebih detail di sini https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/

sarunw
sumber
0

Di Xcode 9.2 dengan Swift, ini bekerja seperti ini:

override func viewWillDisappear(_ animated: Bool) {
   super.viewWillDisappear(true)
   navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Thiago Bueno
sumber
0

Untuk kasus di mana kita tidak memiliki kontrol sama sekali dari pengontrol tampilan sebelumnya (yaitu jika kita bekerja dalam kerangka kerja), kita dapat menghapus judul tombol kembali sebagai berikut:

// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()

// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil

Apa yang dilakukannya adalah menavigasi ke item terakhir dari tumpukan navigasi dan menghapus judul belakangnya. Pastikan untuk menyimpan yang asli ketika pengontrol tampilan kita akan muncul:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
    // Delete title somewhere here...
}

lalu menetapkannya kembali, agar tidak mengganggu bagian mana pun dari aplikasi:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}
Ángel Téllez
sumber
0

Ini akan menyelesaikan masalah Anda:

    import UIKit

    extension UINavigationController{

    func customizeBackArrow(){
        let yourBackImage = UIImage(named: "icon_back_arrow")
        self.navigationBar.backIndicatorImage = yourBackImage
        self.navigationBar.tintColor = Common.offBlackColor
        self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
        navigationItem.leftItemsSupplementBackButton = true
        self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", 
           style: .plain, target: self, action: nil)

    }
}
mossman 252
sumber
0

Saya sudah mencoba beberapa jawaban dan saya tidak bisa membuatnya berfungsi di semua kasus. Jadi ini adalah solusi untuk tidak memengaruhi judul bilah navigasi jika disetel.

    guard let items = viewController.navigationController?.navigationBar.items else { return }
    for item in items {
        if item.title == nil {
            item.title = ""
        }
    }
Rikard Platus
sumber
0

Cara mudah terprogram, tanpa efek samping yang tidak diinginkan, adalah menginisialisasi navigationItem.backBarButtonItem dengan item kosong di metode awakeFromNib dari pengontrol sumber (yang Anda navigasikan):

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

Catatan: Jika Anda menginisialisasi tombol kembali nanti, seperti dalam metode viewDidLoad () , maka Anda akan kehilangan fungsionalitas gesek kembali (menggesek dari tepi kiri ke kanan membawa Anda selangkah mundur dalam tumpukan navigasi).

Kemudian, jika Anda menginginkan teks tombol kembali yang berbeda untuk pengontrol tujuan yang berbeda dan jika Anda menggunakan segues, Anda dapat menyetel judul dalam metode persiapan (untuk segue :, pengirim :) , seperti ini:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let item = navigationItem.backBarButtonItem {
        switch segue.identifier {
        case "SceneOne": item.title = "Back"; break
        case "SceneTwo": item.title = "Home"; break
        case "SceneThree": item.title = nil; break // Use this scene's title
        default: item.title = "" // No text
        }
    }
}
Jiri Volejnik
sumber