Видалити текст із кнопки Назад, зберігаючи піктограму


92

Я хочу видалити текст із кнопки "Назад", але хочу зберегти піктограму. я намагався

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

Однак це повністю видаляє текст та піктограму.

Відповіді:


98

Метод @ rmd2 майже вірний, але замість цього слід вибрати навігаційну панель контролера, на яку буде вказувати " "кнопка "Назад" і вводити в поле кнопки "Назад".

введіть тут опис зображення


1
найгірший спосіб, якщо у контролері перегляду відсутня панель навігації, мені доведеться додати, щоб видалити текст
Даніель Белтрамі,

142

Я знаю, що на це вже є відповідь, але ви можете зробити це і в коді (на випадок, якщо ви працюєте з пером)

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

Додайте вищевказане у перший контролер подання.

Зверніть увагу, що це потрібно робити для кожного контролера перегляду, який натискає. Отже, якщо у вас є 3 контролери перегляду, і ви хочете видалити зворотний текст з усіх них, вам доведеться додати рядок у контролерах перегляду 1 і 2.


5
Це найкраще рішення, яке я бачив до цього часу, не завдає мені проблем
lostAtSeaJoshua

4
.Plainбуло змінено на .plain. Немає великих с.
Гал

Ідеально ..! Це те, що я хочу.
JD.

Найкраще рішення. Дякую.
Баран Емре

1
@ GastónAntonioMontes, він працює на iOS13, але це трохи лічильник інтуїтивно: порожній заголовок backBarButtonItem повинен бути оголошений на штовхає контролері уявлення, а НЕ штовхнув один
Мартін

49

Після багатого пошуку я знайшов найкраще і просте рішення, це вплине на всі viewControllers, написані в Swift 4.2, а також працюють у Swift 5

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

Ласкаво просимо @ e.dimitrow
iOS Lifee

1
Працює як чарівність
Джеррі Окафор

3
Зауважте, що це спрацює лише у тому випадку, якщо ваш ViewController міститься в раскадровці чи коробці ...
Натаніель Блумер

1
Геніальне рішення!
WM

3
Раніше це працювало у мене, але більше не (воно все ще працює на тренажерах iOS 12, тільки не на останньому iOS 13) ...
tanya

35

Текст кнопки "Назад" залежить від заголовка основного подання.

Фокус полягає в тому, щоб очистити заголовок, якщо головний вигляд зникне, і встановити його знову, якщо він відображається знову:

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

Якщо ви хочете , щоб видалити назву кнопки назад від ініційованого контролера уявлення, скажімо , <Settingsщоб <в subSettingsViewController тоді ви , щоб встановити backBarButtonItem титул в SettingsViewController в () viewWillDisappear метод.

Завдання-C:

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

Стрімкий:

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

1
.Plainбуло змінено на .plain. Немає великих с.
Гал

1
Відповідь потрібно оновити для поведінки searchController. Наприклад, якщо ви використовуєте окремий результатVC і торкаєтесь елемента, який штовхає інший ВК, метод viewWillDisappear з початкового searchController не викликається, отже заголовок все ще є
H4Hugo

Це невдалий підхід, якщо ви шукаєте рішення для екранів у всій програмі. - Якщо ви додасте цей код до якогось "Базового контролера перегляду", viewWillDisappear першого контролера подання буде викликатися після viewDidAppear другого контролера подання (де ви зазвичай встановлюєте заголовок) ... це зіпсує заголовки. Найкращий спосіб - це переписати кнопку повернення
Mithra Singam

Дякуємо за ідеальне рішення
SURESH SANKE

28

Якщо ви хочете стрілку назад, наступний код помістіть у файл AppDelegate у метод didFinishLaunchingWithOptions.

Для Свіфта

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

2
мені це подобається, тому що ви можете стандартизувати стиль вашої програми в одному файлі і один раз зателефонувати йому від делегата програми
Aaronium112,

4
Це справді приємне і швидке рішення, але ... це може бути складно, якщо у вас є інші елементи кнопок на панелі, крім задньої
:)

3
Одне спостереження, якщо ви реалізуєте лише атрибут ".normal", ви побачите текст при натисканні. Додайте той самий рядок для ".selected", ".highlighted" та ".disabled". щоб переконатися, що ви не бачите мерехтливого тексту.
Nick N

1
Я думаю, це матиме побічний ефект, інші кнопки на панелі, крім кнопок назад, також будуть
зачіпані

23

У моєму випадку для власної піктограми та заголовка це зробило трюк (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
останній рядок у цьому коді працював у мене бездоганно. Всі інші пропозиції не спрацювали, можливо, тому, що всі мої контролери подання контролюються навігаційним контролером. У якому випадку NavigationController? дійсно потрібно.
Salx

Щоб додати власну кнопку повернення, вам знадобляться чотири рядки. В іншому випадку останній рядок зробить свою справу.
Рафікул Хасан,

14

Я вирішив цю проблему, додавши "" до заголовка StoryBoard попереднього ViewController. Просто простір, не порожній; D

введіть тут опис зображення


Мені потрібно, щоб попередній екран мав заголовок, тому, мабуть, це не спрацює для мене.
lmiguelvargasf

2
Я затулив цей заголовок, але заголовок все ще надходить у заголовку кнопки "Назад"
Хімалі Шах,

1
не пустіть заголовок, поле, поставте "" (пробіл) у поле кнопки "Назад"
Кирило С.

13

Нарешті знайшов ідеальне рішення.

Просто додайте одне прозоре зображення та додайте наступний код у свій AppDelegate.

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

1
Це, безумовно, найкраща відповідь. Раніше я використовував UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustmentхак, який рекомендують більшість інших відповідей, але він був зламаний на iPhone X для контролерів перегляду з довгими заголовками. Це рішення працює бездоганно.
Нед,

3
Краща відповідь. Працював краще, ніж прозорий колір тексту.
Вільям Т.,

1
Найкраще рішення, що я використовував за останні 4 роки! Ви робите це один раз, в одному місці та для всіх контролерів огляду !!!
korgx9

1
Коли я спробував це з iOS 12, текст все ще з'явився поруч із зображенням. :(
Шон МакМейнс

13

стрімко 4

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

Дякую, це мені допомогло, (Swift 4.0, Xcode 10.1, iOS 12.1.1), дякую
infinity_coding7

3
АЛЕ, ти втратиш свій титул у батьківському vc
Вей Лу

1
Якщо великий заголовок присутній, тоді topItem є largeTitle. Не працює
Саранджіт,

10

Для Swift 4+ поставте ці рядки в AppDelegateatdidFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

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

Коли ви встановлюєте зовнішній вигляд у представнику програми, чіткий колір переднього плану є для кожного елемента UIBarButtonItem, чи не так? Отже, якщо я додаю UIBarButtonItem з текстом, чи потрібно мені змінювати колір переднього плану для цієї кнопки вручну?
кузду

1
Це добре, але при натисканні кнопки "Назад" все одно відображається текст
Вільям Т.,

Це працює, але змусить іншу кнопку на панелі зникнути в iOS 11. Відповідь від Рафікула Хасана вище може вирішити проблему
huync

8

Це працює для мене

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

Правильний. В iOS 13 NavigationItem.backBarButtonItem не працює. Це заощадило мої години зусиль. Дякую
Manish

5

Якщо у вас є ViewControllerA і ви хочете перейти до ViewControllerB, у ViewControllerA вам слід встановити поточний навігаційний елемент за допомогою нового UIBarButtonItem і заголовок до рядка з порожнім пробілом перед натисканням на інший контролер подання:

Встановіть для заголовка рядок із порожнім пробілом, ви не можете встановити нуль або "" (порожній рядок), оскільки значенням за замовчуванням є нуль

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

5

Помістіть цей код у кожен ВК, який штовхає інший

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

Щоб видалити з усіх контролерів огляду в стеку контролера навігації:

підклас UINavigationController і додайте це:

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

Іноді не вдається змінити лише колір заголовка, якщо заголовок довгий. Оскільки це може змістити заголовок навігаційної панелі вліво. Отже, щоб запобігти цьому, вам, можливо, доведеться зрушити заголовок кнопки панелі горизонтально, щоб зробити його прозорим:

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

1

Для мене це зробило фокус:

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 він буде з'являтися на роботі. Але якщо ви спробуєте повернутися за допомогою жесту, а потім скасувати та залишитися на контролері висунутого перегляду, задня назва повернеться назад.

Робота в Swift 4


Не могли б ви пояснити?
mrc

У мене є контролер, який завжди відображає текст "Назад" за допомогою кнопки "Назад". Тож вищезгаданий код не працює в моєму випадку
Шахбаз Акрам

1

Вам слід вибрати навігаційну панель контролера, з якої кнопки "Назад" буде вказувати і ввести "" в поле "Назад".

наприклад, якщо ви натискаєте контролер на контролер B, вставте пробіли в панель навігації контролера.


1

Xcode 10, Swift 4+

Відповідь, аналогічна іншим тут, але варто зазначити, що якщо текст все ще не очищений, потрібно натиснути клавішу Пробіл, а потім Enter.

введіть тут опис зображення


1

Деталі

  • Версія Xcode 10.2.1 (10E1001), Swift 5

Рішення

1. Створіть власний клас 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. Додайте розширення UIViewController

import UIKit

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

3. Оновіть клас ViewController

import UIKit

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

Повний зразок

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

Результат

введіть тут опис зображення


1

Один з варіантів , щоб перевизначити всі ViewControllersдля мене було розширити UINavigationControllerі встановити backBarButtonItemз topViewController.

Swift 5 на 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
    }
}

1

Найпростіший спосіб зробити це програмно - встановити backBarButtonItemз батьківського контролера подання (контролер, який викликає push).

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

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

Детальніше тут https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/


1

Ви можете видалити текст із кнопки "Назад", використовуючи метод делегування 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)
    }
    
}

0

У Xcode 9.2 з Swift це працювало так:

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

0

У випадку, коли ми взагалі не контролюємо попередній контролер подання (тобто, якщо ми працюємо в рамках), ми можемо видалити заголовок кнопки "Назад" наступним чином:

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

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

Для цього потрібно перейти до останнього елемента стека навігації та видалити його задню назву. Обов’язково збережіть оригінальний, коли з’явиться наш контролер перегляду:

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

а потім перепризначити його, щоб не порушити жодну частину програми:

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

0

Це вирішить вашу проблему:

    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

Я спробував кілька відповідей, і я не можу змусити їх працювати у всіх випадках. Отже, це обхідне рішення, щоб не впливати на заголовок панелі навігації, якщо вона встановлена.

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

0

Простий програмний способом, без небажаних побічних ефектів, є инициализацией navigationItem.backBarButtonItem з порожнім елементом в awakeFromNib способі вихідного контролера (той , який ви ходові від):

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

Примітка: Якщо ви ініціалізували кнопку "Назад" пізніше, як у методі viewDidLoad () , ви втратите зворотне перенесення функцію пальцем від лівого краю до правого, ви повернетеся на крок назад у стеці навігації).

Потім, якщо вам потрібні різні тексти кнопок повернення для різних контролерів призначення, і якщо ви використовуєте сегменти, ви можете встановити заголовок у методі підготовки (для методу segue :, sender :) , наприклад:

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
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.