Як видалити заголовок кнопки "Назад" на панелі навігації


83

Коли я натискаю a UIViewController, у новій кнопці назад є новий UIViewControllerзаголовок, якщо в заголовку багато тексту, це не виглядає добре в iPhone 4s, тому я хочу його видалити.

Якщо я додаю якийсь код у prepareForSegueфункцію, це буде проблемою.

Будь-який кращий спосіб досягти цього?


Ви також можете змінити назву кнопки "Назад". а для повернення вам потрібна кнопка "Назад". тому я думаю, що не потрібно видаляти кнопку "Назад".
Ашок Лондхе

будь ласка, повідомте про це після вирішення вашої проблеми.
Ашок Лондхе,

посилатися на цю відповідь stackoverflow.com/a/48801613/3976183
Lalit Kumar

є приємна стаття щодо цього питання sarunw.com/posts/…
user3672430

Відповіді:


129

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

For Objective-C

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

For Swift

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

Інший варіант наведемо нижче.

В Objective C

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

В Swift

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

ОНОВЛЕННЯ:

    let BarButtonItemAppearance = UIBarButtonItem.appearance()

    let attributes: [NSAttributedStringKey: Any] = [
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
            NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
            NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

ОНОВИТИ SWIFT 4.1:

    let attributes = [NSAttributedStringKey.font:  UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

Використання офсету

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)

Тож можливо ваша проблема була вирішена.

Щасливого кодування.


8
setBackButtonTitlePositionAdjustmentне завжди працює, коли заголовок кнопки "Назад" дуже довгий, але недостатньо довгий, щоб змінити його на "Назад", заголовок посередині переміститься вправо.
zgjie

3
@zgjie це лише тема того, наскільки великим є ваш компенсатор. ви можете легко замінити '-60' на '-6000' і забути про цю проблему
slxl

10
Тільки трохи точності тут, заголовок належить попередньому контролеру перегляду. Тому не забудьте встановити його там, перед методом presentViewController або pushViewController.
Бенджамін

1
Хм, це не працює в AppDelegate. "Значення типу AppDelegate не має елемента navigationItem"
Прабху,

3
@DominikBucher Я створив категорію для цієї поведінки, яка приховує заголовок кнопки "Назад" у будь-якій точці програми, яка є якось "НЕ ХАКІ" , просто додайте категорію у свій проект, і все готово. Я категорично не погоджуюся з рішенням встановлення положення, setBackButtonTitlePositionAdjustment:forBarMetrics:якщо користувач увімкнув форму кнопки з налаштувань доступності, фігура відображатиметься, закінчуючи потворною панеллю навігації.
Пратік Джамарія

72

Робота як шарм на Swift 3

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

1
Це єдиний, який спрацював під час використанняnavigationController?.pushViewController(_, animated:)
Д. Грег,

Дякую, друже. Цей єдиний вийшов. Ура.
Феліпе

3
Працював у мене також Swift 4
christijk

1
@MaksimKniazev, будь-яке вирішення цієї проблеми? Я знайшов єдине рішення для оновлення заголовка знову в viewWillAppear:.
Hemang,

4
це видаляє заголовок попереднього подання
Насер Мохамед

51

Я використовую цей рядок коду у AppDelegateфайлі у didFinishLaunchingWithOptionsметоді, щоб видалити кнопку back title.

Свіфт 2.x

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)

Свіфт 3.x

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

Свіфт 4.x

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)

17
setBackButtonTitlePositionAdjustmentне завжди працює, коли заголовок кнопки "Назад" дуже довгий, але недостатньо довгий, щоб змінити його на "Назад", заголовок посередині переміститься вправо.
zgjie

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

2
в iOS 11 це перервати позицію кнопки повернення назад. Він опускається нижче свого початкового положення
korgx9,

Як це має працювати? Текст все одно буде доступний через VoiceOver.
Лукаш Кястко

Це створює проблему, коли скасування або завершення barbuttonitem не видно при презентації imagepicker або щось подібне
Nupur Sharma

16

Просто потрібно перейти до батьківського ViewController, звідки залежать інші ViewControllers.

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

16

Просто скопіюйте цей код в didFinishLaunchingWithOptions launchOptions

Стрімкий 5

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)

Стрімкий 4

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)

12

це просто. поставте пробіл у заголовку кнопки "Назад" і готово. Пам'ятайте, що це має бути в попередньому поданні, де ви хочете видалити текст.

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


Найкраще рішення IMO. Не вимагає, щоб ви налаштували всю програму на певний чіткий стиль, що може мати побічний ефект від зникнення будь-яких текстових барбутонних елементів. Відповідь може бути кращою, якщо в ній згадується, що вам доведеться перетягнути елемент навігації до свого контролера, якщо там його немає.
TheJeff,

7

Ви можете використовувати xcode 8 і swift 3.0

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

3
Чи не буде це взагалі видалити заголовок із попереднього контролера перегляду?
NRitH

1
Так, це видалить заголовок для всіх, ViewControllerкого виштовхувалиself.navigationController
Євген Дубінін

7

Ви можете створити підклас для всіх, для UIViewControllerкого вам потрібна така поведінка, та для підкласу viewDidLoad:

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

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


6
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

використовував цей рядок коду в swift 3.0


1
вплине на кнопку скасування для UISearchController
JAHelia

5

Беручи натхнення з rordulu ігрового відповіді тут , я в кінцевому підсумку створення призначених для користувача UINavigationController і UINavigation бару , який , здається обробляти всі випадки цієї складної проблеми.

1) Ініціюйте нове UINavigationControllerза вашим замовленням UINavigationBar:

class CustomNavigationController: UINavigationController {

    convenience init() {
        self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    }
}

2) Встановіть для backItem.titleвластивості панелі навігації порожній рядок кожного разу, коли подання викладається

class CustomNavigationBar: UINavigationBar {

    override func layoutSubviews() {
        backItem?.title = ""
        super.layoutSubviews()
    }
}

Тепер кожного разу, коли ви використовуєте цей навігаційний контролер та комбінацію панелей, він ніколи не матиме тексту кнопки повернення! 🎉

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


Дивовижне спасибі! Це найкращий спосіб це зробити, і це має бути правильна відповідь :)
GameDev

3
Щойно зрозумів, що це має побічний ефект, оскільки воно повністю видалить заголовок елемента навігації. Отже, коли буде показано попередній вигляд, він не матиме назви! Я продовжуватиму пошуки ідеального рішення цієї набридливої ​​проблеми.
Harry Bloom

блін ти маєш рацію. Як я міг пропустити це! Скажіть, будь ласка, чи знайдете ви вирішення цієї проблеми. подяка
GameDev

Не могли б ви знайти ідеальне рішення @HarryBloom?
Hemang

@Hemang Не ідеальне рішення, але я знайшов щось, що працює. Додали другу відповідь тут stackoverflow.com/a/49094282/1532838
Гаррі Блум

3

Я зазвичай додаю або змінюю кнопку повернення у viewDidLoad UIViewController.

Щось подібне повинно працювати:

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

Не забудьте змінити та реалізувати функцію, яка називається, щоб закрити представлення.

Ще простіше, просто змініть заголовок:

self.navigationItem.leftBarButtonItem.title = "Back"

7
Це порушує вбудовану підтримку iOS для проведення пальцем зліва направо для навігації назад, а програми IMHO, які порушують це, справді дратують.
NRitH

3

На iOS 14 тепер присутня backButtonDisplayModeвластивість уUINavigationItem класі. Отже, для видалення заголовка кнопки "Назад" ви можете скористатися

navigationItem.backButtonDisplayMode = .minimal

в viewDidLoad функції viewController, де ви хочете його видалити.

Щоб видалити його з усієї панелі навігації, я використав техніку зміни розміру

import UIKit

private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
        if didAddMethod {
            class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

extension UIViewController {
    
    static func swizzle() {
        let originalSelector1 = #selector(viewDidLoad)
        let swizzledSelector1 = #selector(swizzled_viewDidLoad)
        swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
    }
    
    @objc open func swizzled_viewDidLoad() {
        if let _ = navigationController {
            if #available(iOS 14.0, *) {
                navigationItem.backButtonDisplayMode = .minimal
            } else {
                // Fallback on earlier versions
                navigationItem.backButtonTitle = ""
            }
        }
        swizzled_viewDidLoad()
    }
}

І в application(_:didFinishLaunchingWithOptions:)дзвінку

UIViewController.swizzle()


2

Додавання другої відповіді тут як моєї першої працює лише частково. Цей метод менш елегантний тим, що вимагає виклику методу в кожному поданні програми, однак він працює без побічних ефектів.

Отже, по-перше, створіть клас розширення UIViewController з функцією видалення тексту кнопки повернення та додавання власної кнопки повернення:

extension UIViewController {

func setBackButton() {
    navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

По-друге, ми можемо просто викликати цю функцію в viewDidLoadкожному контролері перегляду, в якому вона вам потрібна.


2

Просте рішення:

Поки ви штовхаєте 2-й контролер з 1-го контролера, поставте self.navigationItem.title = "" у viewWillDisappear 1-го контролера. Він приховує назву кнопки "Назад" від 2-го контролера.

Над статусом ховається назва 1-го контролера, тому, коли ми повернулися, ми знову хочемо заголовок 1-го контролера. Для цього ми додали заголовок для 1-го контролера у viewWillAppear метод 1-го контролера.

Зверніться до наступних методів (1-го контролера)

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

override func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "Title"
}

2

Свіфт 4.2

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

Кнопка "Скасувати" та "Готово" в програмі збору зображень зникає при такому підході
Нупур Шарма

2

Оновлена ​​відповідь для Swift 4.2

Робота з цим UIAppearanceє більш чистим способом вирішення проблеми, але це призведе до того, що у всіх UIBarButtonItemбуде чіткий текст. Покращеною версією рішення може бути перевірка, чи UIBarButtonItemміститься вона в UINavigationBar.

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

1

Просто створіть розширення UIViewControllerз функцією перевизначення awakeFromNib()і зробіть UIBarButtonItemз порожнім заголовком і дайте navigation backBarButtonItem.

extension UIViewController {

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

}

1

Помістіть наведений нижче код у будь-який із них, і UIViewcontroller extensionвін приховає весь UIViewcontrollerзворотній текст

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

1

Працює над Swift 5 :

        self.navigationItem.backBarButtonItem?.title = ""

Зверніть увагу, що це буде ефективно для наступного контролера поданого перегляду, а не для поточного на дисплеї, тому він дуже заплутаний!

Також перевірте розкадрування та виберіть пункт навігації попереднього контролера перегляду, а потім введіть щось у кнопку Назад (Інспектор).


1

У мене є просте рішення для тих, хто не хоче використовувати метод зміни розміру або дублювання подібного коду в різних контролерах подання.

Щоб видалити заголовок кнопки "Назад", створіть підклас UINavigationController і перевизначте метод pushViewController (_, анімований :):

final class CustomNavigationController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {

        super.pushViewController(viewController, animated: animated)

        let backBarButtonItem = UIBarButtonItem()
        backBarButtonItem.title = nil

        viewController.navigationItem.backBarButtonItem = backBarButtonItem
    }
}

1

Метод для iOS13.

let backButtonAppearance = UIBarButtonItemAppearance(style: .plain)
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]

let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.backButtonAppearance = backButtonAppearance

UINavigationBar.appearance().standardAppearance = navigationBarAppearance

0

Я не знаю, чому, але я знайшов проблему з приховуванням назви кнопки "Назад" у плюсах iPhone, але в пристрої без плюсів, відображається правильно

leftBarButtonItem.title = ""

Тож я знайшов простий спосіб. Колір відтінку встановлено для очищення на панелі навігації NavigationViewController в авторозкладці. Це може бути проблемою, якщо ви використовуєте піктограми або текстові фрагменти з відтінком. Але в моєму випадку я не використовую його як усі.


0

Просто використовуйте це:

func removeBackButton(vc:UIViewController) {
        let button = UIButton.init(type: .custom)
        button.setImage(UIImage.init(named:""), for: .normal)
        let leftBarButton = UIBarButtonItem.init(customView: button)
        vc.navigationItem.leftBarButtonItem = leftBarButton
}

Тож викликайте цей метод у viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()
     removeBackButton(vc:self)
}

0

Ви можете додати це розширення до UIViewController А потім викликати цю функцію в кожному viewDidLoad (), наприклад: self.updateBackButton ()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}

0

Я хотів би поділитися рішенням, яке мені підходить. Крім того, його можна скоригувати на основі ваших потреб та вимог.

Зверніть увагу, що в моєму випадку я використовую розкадрування, щоб вказати CustomNavigationBar

Свіфт 4.2

class CustomNavigationBar: UINavigationBar {

    override func awakeFromNib() {
        super.awakeFromNib()
        guard let topItem = topItem else { return }
        removeBackButtonTitle(for: topItem)
    }

    override func pushItem(_ item: UINavigationItem, animated: Bool) {
        removeBackButtonTitle(for: item)
        super.pushItem(item, animated: animated)
    }

    func removeBackButtonTitle(for item: UINavigationItem) {
        item.backBarButtonItem = UIBarButtonItem()
    }
}

0

Працює для Swift 4.2

Використання рядка коду у AppDelegateфайлі вdidFinishLaunchingWithOptions

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)

Це приховує текст кнопки на задній панелі, але, на жаль, не центрує заголовок панелі навігації
Джорджо

0

Свіфт 4.2 і 5

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

Використовуйте код нижче:

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

Зателефонуйте йому з першого ViewController:

self.awakeFromNib()

0

для стрімких 4,5

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

0

в viewDidLoad()

    let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarButtonItem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.