Simgeyi koruyarak Geri düğmesinden metni kaldırın


96

Metni geri düğmesinden kaldırmak istiyorum, ancak simgeyi korumak istiyorum. denedim

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

Ancak bu, metni ve simgeyi tamamen kaldırır.

Yanıtlar:


99

@ Rmd2 yöntemi neredeyse doğrudur, ancak bunun yerine, geri düğmesinin işaret edeceği denetleyicinin gezinme çubuğunu seçmeli " "ve Geri Düğmesi alanına yazmalısınız .

görüntü açıklamasını buraya girin


1
En kötüsü, görüntü denetleyicide gezinme çubuğu yoksa, metni kaldırmak için eklemem gerekecek
Daniel Beltrami

144

Bunun zaten bir cevabı olduğunu biliyorum, ancak bunu kodla da yapabilirsiniz (uçlarla çalışıyorsanız)

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

Yukarıdakileri ilk görünüm denetleyicisine ekleyin.

Bunu iten her görüntü denetleyicisi için yapmanız gerektiğini unutmayın. Dolayısıyla, 3 görünüm denetleyiciniz varsa ve tümünün arka metnini kaldırmak istiyorsanız, satırı görünüm denetleyicisi 1 ve 2'ye eklemeniz gerekir.


5
Bu şimdiye kadar gördüğüm en iyi çözüm bana sorun
çıkarmıyor

5
.Plainolarak değiştirildi .plain. Büyük harf yok s.
Gal

Mükemmel..! İstediğim bu.
JD.

En iyi çözüm. Teşekkürler.
Baran Emre

1
@ GastónAntonioMontes, bu iOS13 üzerinde çalışır, ancak sezgisel biraz sayacı var: backBarButtonItem deklare edilmelidir boş başlık iterek görünümü denetleyicisi değil itti tek
Martin

51

Çok aradıktan sonra en iyi ve basit çözümü buldum, bu Swift 4.2'de yazılan ve ayrıca Swift 5'te çalışan tüm viewControllers'ı etkileyecek.

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

Hoş geldiniz @ e.dimitrow
iOS Lifee

1
Cazibe gibi çalışıyor
Jerry Okafor

5
Bunun yalnızca ViewController'ınız bir Hikaye Panosu veya Uçta bulunuyorsa işe yarayacağını unutmayın ...
Nathaniel Blumer

1
Dahice bir çözüm!
WM

3
Bu eskiden benim için çalışıyordu, ancak artık değil (hala iOS 12 simülatörlerinde çalışıyor, en son iOS 13'te değil) ...
tanya

37

Geri düğmesinin metni, ana görünümün başlığına bağlıdır.

İşin püf noktası, ana görünüm kaybolursa başlığı temizlemek ve yeniden gösterilirse yeniden ayarlamaktır:

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

33

Bir itilmiş görünüm denetleyicisinden bir geri düğmesi başlığını kaldırmak istiyorsa, diyelim <Settingsiçin <subSettingsViewController sonra ayarlamak ettik backBarButtonItem SettingsViewController en başlığı viewWillDisappear () yöntemi.

Amaç-C:

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

Swift:

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

1
.Plainolarak değiştirildi .plain. Büyük harf yok s.
Gal

1
SearchController davranışı için yanıtın güncellenmesi gerekiyor. Örneğin, ayrı bir resultsVC kullanırsanız ve başka bir VC'yi iten bir öğeye dokunursanız, ilk searchController'deki viewWillDisappear yöntemi çağrılmaz, dolayısıyla başlık hala oradadır
H4Hugo

Uygulamanın tamamındaki ekranlar için bir çözüm arıyorsanız, bu iyi bir yaklaşım değildir. - Bu kodu bir "Temel Görünüm Denetleyicisine" eklerseniz, birinci görünüm denetleyicisinin viewWillDisappear'ı, ikinci görünüm denetleyicisinin (genellikle başlığı ayarladığınız) viewDidAppear'dan sonra çağrılacaktır ... bu, başlıkları karıştıracaktır. En iyi yol, geri yazma düğmesinin üzerine
yazmaktır

Mükemmel Çözüm Teşekkürler
SURESH SANKE

28

Geri ok istiyorsanız, aşağıdaki kodu AppDelegate dosyasına didFinishLaunchingWithOptions yöntemine koyun.

Swift için

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)

2
Bunu beğendim çünkü uygulamanızın stilini tek bir dosyada standartlaştırabilir ve uygulama temsilcisinden bir kez çağırabilirsiniz
Aaronium112

4
Gerçekten güzel ve hızlı bir çözüm, Ama ... arkadaki hariç diğer çubuk düğmesi öğeleriniz varsa bu biraz zor olabilir
:)

3
Bir gözlem, yalnızca ".normal" özelliğini uygularsanız, tıklandığında metni görürsünüz. ".Selected", ".highlighted" ve ".disabled" için aynı satırı ekleyin. titreyen metni görmediğinizden emin olmak için.
Nick N

1
Bunun bir yan etkisi olacağını düşünüyorum, arka düğmelerin dışındaki diğer çubuk düğmeleri de etkilenecek ve net bir metin rengine sahip olacak :(
dhin

24

Benim durumumda, özel simge ve başlık için bu hile yaptı (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)

1
o kodun son satırı benim için kusursuz çalıştı. Diğer tüm öneriler işe yaramadı, çünkü muhtemelen görüntüleme denetleyicilerimin tümü bir nav denetleyicisi tarafından kontrol ediliyor. Hangi durumda, navigationController? gerçekten gerekli.
Salx

Özel bir geri düğmesi eklemek istiyorsanız ilk dört satıra ihtiyacınız olacak. Aksi takdirde son satır hile yapacak.
Rafiqul Hasan

14

Önceki ViewController'ın StoryBoard Başlığına "" ekleyerek bu sorunu çözdüm. Sadece bir boşluk, boş değil; D

görüntü açıklamasını buraya girin


Önceki ekranın bir başlığa sahip olmasına ihtiyacım var, bu yüzden sanırım bu benim için işe yaramayacak.
lmiguelvargasf

2
Bu başlığı boş bıraktım ama yine de başlık geri düğmesi başlığında geliyor
Himali Shah

1
Başlık, alanı boş bırakmayın, Geri Düğmesi alanına "" (boşluk) yazın
Kiril S.

13

Sonunda mükemmel bir çözüm buldu.

Sadece bir şeffaf Görüntü ekleyin ve AppDelegate'inize aşağıdaki kodu ekleyin.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

1
Bu kesinlikle en iyi cevap. Daha önce UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustmentdiğer yanıtların çoğunun önerdiği hack'i kullanıyordum , ancak iPhone X'te uzun başlıklara sahip görüntü denetleyicileri için kırılmıştı. Bu çözüm kusursuz çalışıyor.
Ned

3
En iyi cevap. Şeffaf metin renginden daha iyi çalıştı.
William T.

1
Son 4 yılda kullandığım en iyi çözüm! Bunu bir kez, tek bir yerde ve tüm görüntü denetleyicileri için yaparsınız !!!
korgx9

1
Bunu iOS 12 ile denediğimde, metin hala görüntünün yanında görünüyordu. :(
Sean McMains

13

hızlı 4'te

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

Teşekkürler, bana yardımcı oldu, (Swift 4.0, Xcode 10.1, iOS 12.1.1), teşekkürler
infinity_coding7

3
AMA, ebeveyn vc'de unvanını kaybedeceksin
Wei Lu

1
Büyük başlık varsa, topItem largeTitle'dır. Mu değil çalışır
Saranjith

11

Bu benim için çalışıyor

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

1
Doğru olan. İOS 13'te, navigationItem.backBarButtonItem çalışmıyor. Saatler süren çabalarımı kurtardı. Teşekkürler
Manish

10

İçin Swift 4+ bu satırları koymak AppDelegateendidFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

Uygulama temsilcisindeki görünümü ayarladığınızda, ön plan rengi her UIBarButtonItem içindir, değil mi? Öyleyse, metin içeren bir UIBarButtonItem eklersem, bu düğme için ön plan rengini manuel olarak değiştirmem gerekir mi?
kuzdu

1
Bu iyi ama geri düğmesine bastığınızda hala metin gösterir
William T.

Çalışıyor ancak iOS 11'de diğer çubuk düğmesinin kaybolmasına neden oluyor. Yukarıdaki Rafiqul Hasan'ın cevabı sorunu çözebilir
huync

6

Bir ViewControllerA'nız varsa ve ViewControllerA'da ViewControllerB'ye gitmek istiyorsanız, başka bir görünüm denetleyicisine göndermeden önce yeni bir UIBarButtonItem ile mevcut navigationItem'i ve başlığı boş alan içeren bir dizeye ayarlamanız gerekir:

Başlığı boş boşluklu bir dizeye ayarlayın, nil veya "" (boş dize) ayarlayamazsınız çünkü varsayılan değer nildir

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)

Başlık "" olarak ayarlandığında (ve bu şekilde incelendiğinde) bile "Geri" metni yeniden göründüğünde ViewControllerB(şimdiye kadar her zaman işe yaramış olsa da, benim özel durumumla) çok komik davranışlar alıyordum. benim için çalışan tek çözüm
10623169

6

Bu kodu, diğerini zorlayan her VC'ye koyun

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

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
}

3

Gezinme denetleyicisi yığınındaki tüm görünüm denetleyicilerinden kaldırmak için:

alt sınıf UINavigationController ve şunu ekleyin:

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

2

Bazen başlığın uzun olması durumunda sadece başlık rengini değiştirmeye çalışmıyor. Çünkü gezinme çubuğu başlığını sola kaydırabilir. Bu nedenle, bunu önlemek için, çubuk düğmesi başlığını yatay olarak kaydırmanız ve şeffaf hale getirmeniz gerekebilir:

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

2

Detaylar

  • Xcode Sürümü 10.2.1 (10E1001), Swift 5

Çözüm

1. UINavigationController'ın özel sınıfını oluşturun

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. UIViewController uzantısını ekleyin

import UIKit

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

3. ViewController sınıfınızı güncelleyin

import UIKit

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

Tam örnek

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

Sonuç

görüntü açıklamasını buraya girin


2

Temsilci yöntemini kullanarak geri düğmesinden metni kaldırabilirsiniz 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)
    }
    
}

1

Benim için bu hile yaptı:

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

BackBarButtonItem öğesini değiştirmeden yalnızca başlığı ayarlarsanız, işe yarıyor gibi görüneceğine dikkat edin. Ancak bir hareketle geri dönmeyi denerseniz ve iptal ederseniz edip basılan görünüm denetleyicisinde kaldıktan sonra, arka başlık geri gelecektir.

Swift 4'te Çalışma


Açıklar mısın
mrc

Her zaman geri düğmesiyle Geri metnini gösteren denetleyicim var. Bu yüzden yukarıdaki kod benim durumumda çalışmıyor
Shahbaz Akram

1

Geri düğmesinin işaret edeceği KİMDEN denetleyicinin gezinme çubuğunu seçmeli ve Geri Düğmesi alanına "" yazmalısınız.

Örneğin, A denetleyicisini B denetleyiciye itiyorsanız, A denetleyici gezinme çubuğuna beyaz boşluk koyun.


1

Xcode 10, Swift 4+

Buradaki diğerlerine benzer cevaplar, ancak metin hala temizlenmediyse, Boşluk'u ve ardından Gir'i tıklamanız gerektiğini belirtmek gerekir.

görüntü açıklamasını buraya girin


1

Tüm geçersiz kılmak için bir alternatif ViewControllersbenim için genişletmek oldu UINavigationControllerve set backBarButtonItemarasında topViewController.

Swift 5 Xcode 11.2.1'de:

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

1

Bunu programlı olarak yapmanın en kolay yolu backBarButtonItem, üst görünüm denetleyicisinden (push çağıran bir denetleyici) ayarlamaktır.

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

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

Daha fazla ayrıntı burada https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/


0

Swift ile Xcode 9.2'de şu şekilde çalıştı:

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

0

Önceki görünüm denetleyicisinin hiçbirini kontrol edemediğimiz durumlar için (yani, bir çerçevede çalışıyorsak), geri düğmesinin başlığını aşağıdaki gibi silebiliriz:

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

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

Yaptığı şey, gezinme yığınının son öğesine gitmek ve arka başlığını silmektir. Görüntü denetleyicimiz göründüğünde orijinali kaydettiğinizden emin olun:

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

ve ardından uygulamanın herhangi bir bölümünü kesintiye uğratmamak için yeniden atayın:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}

0

Bu, sorununuzu çözecektir:

    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)

    }
}

0

Birkaç cevap denedim ve her durumda onları çalıştıramıyorum. Dolayısıyla bu, ayarlanmışsa gezinme çubuğunun başlığını etkilemeyecek bir geçici çözümdür.

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

0

İstenmeyen yan etkiler olmaksızın kolay programlı yol, navigationItem.backBarButtonItem öğesini kaynak denetleyicinin awakeFromNib yönteminde ( içinde gezindiğiniz) boş bir öğeyle başlatmaktır :

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

Not: Geri düğmesini daha sonra, viewDidLoad () yönteminde olduğu gibi başlatırsanız, geri kaydırmayı kaybedeceğinizden işlevini (sol kenardan sağa kaydırmak, gezinme yığınında bir adım geri gitmenizi sağlar).

Ardından, farklı hedef denetleyicileri için farklı geri düğmesi metinleri istiyorsanız ve segment kullanıyorsanız, başlığı hazırla ( segment için :, gönderen :) yönteminde şu şekilde ayarlayabilirsiniz :

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
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.