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.
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.
sumber
.Plain
diubah menjadi.plain
. Tanpa huruf kapital p.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) } }
sumber
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" }
sumber
Jika Anda ingin menghapus judul sebuah tombol kembali dari mendorong controller tampilan, katakanlah
<Settings
untuk<
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) }
sumber
.Plain
diubah menjadi.plain
. Tanpa huruf kapital p.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)
sumber
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)
sumber
Saya memecahkan masalah ini dengan menambahkan "" pada Judul Papan Cerita dari ViewController sebelumnya. Cuma spasi, tidak kosong; D
sumber
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)
sumber
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment
retasan yang paling direkomendasikan oleh jawaban lain, tetapi itu rusak di iPhone X untuk pengontrol tampilan dengan judul yang panjang. Solusi ini bekerja dengan sempurna.dengan cepat 4
self.navigationController?.navigationBar.topItem?.title = ""
sumber
Ini bekerja untuk saya
override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
sumber
Untuk Swift 4+, masukkan baris-baris ini
AppDelegate
dididFinishLaunchingWithOptions
let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal) BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
sumber
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)
sumber
ViewControllerB
(meskipun itu selalu berhasil sampai sekarang, dengan kasus tepi khusus saya), ini satu-satunya solusi yang berhasil untuk sayaLetakkan kode ini di setiap VC yang mendorong satu sama lain
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
sumber
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 }
sumber
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) }
sumber
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)
sumber
Detail
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
sumber
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) } }
sumber
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
sumber
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.
sumber
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.
sumber
Salah satu alternatif untuk menimpa semua
ViewControllers
bagi saya adalah untuk memperpanjangUINavigationController
dan mengaturbackBarButtonItem
daritopViewController
.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 } }
sumber
Cara termudah untuk melakukan ini secara terprogram adalah dengan menyetel
backBarButtonItem
dari 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/
sumber
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) }
sumber
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) }
sumber
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) } }
sumber
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 = "" } }
sumber
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 } } }
sumber