Подтвердить что ты не робот

Удалить текст с кнопки "Назад", удерживая значок

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

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

Однако это полностью удаляет текст и значок.

4b9b3361

Ответ 1

Метод @rmd2 почти верен, но вместо этого вы должны выбрать панель навигации контроллера, на которую будет указывать кнопка " " Назад", и ввести " " в поле "Кнопка возврата".

enter image description here

Ответ 2

Я знаю, что на это уже есть ответ, но вы также можете сделать это в коде (если вы работаете с перьями)

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

Добавьте вышеупомянутое в первом контроллере представления.

Обратите внимание, что вам нужно сделать это для каждого контроллера представления, который выдвигает. Так что, если у вас есть 3 контроллера представления, и вы хотите удалить задний текст из всех них, вам нужно будет добавить строку в контроллеры представления 1 и 2.

Ответ 3

Если вы хотите удалить заголовок кнопки "Назад" из контроллера push-представления, скажем, <Settings to < в subSettingsViewController, тогда вам нужно установить заголовок backBarButtonItem в методе SettingsViewController viewWillDisappear().

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

Ответ 4

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

Хитрость заключается в том, чтобы очистить заголовок, если главный вид исчез и снова установите его, если он снова отображается:

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

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

Ответ 5

Если вы хотите стрелку назад, следуйте следующему коду, помещенному в файл AppDelegate в метод didFinishLaunchingWithOptions.

Для Свифта

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

Ответ 6

В моем случае для пользовательского значка и названия это сделало трюк (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)

Ответ 7

После поиска я нашел лучшее и простое решение, это повлияет на все viewControllers, написанные в Swift 4.2

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

Ответ 8

Я решил эту проблему, добавив "" в заголовок StoryBoard предыдущего ViewController. Просто пробел, а не пустой, D

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

Ответ 9

Наконец нашел идеальное решение.

Просто добавьте одно прозрачное изображение и добавьте следующий код в свой AppDelegate.

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

Ответ 10

Для Swift 4+ поместите эти строки в AppDelegate в didFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

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

Ответ 11

в быстром 4

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

Ответ 12

Если у вас есть ViewControllerA, и вы хотите перейти к ViewControllerB, в ViewControllerA вы должны установить текущий навигационный элемент с новым UIBarButtonItem и заголовок в строку с пустым пространством перед передачей в другой контроллер представления:

Установите заголовок для строки с пробелом, вы не можете установить nil или "" (пустая строка), потому что значение по умолчанию равно nil

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

Ответ 13

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
}

Ответ 14

Поместите этот код в каждый VC, который выдвигает другой

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

Ответ 15

Чтобы удалить из всех контроллеров view в стеке контроллера навигации:

подкласс 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)
}

Ответ 16

Иногда не удается изменить только цвет заголовка, если заголовок длинный. Потому что это может сместить заголовок панели навигации влево. Поэтому, чтобы предотвратить это, вам может понадобиться сдвинуть заголовок кнопки панели по горизонтали, чтобы сделать ее прозрачной:

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

Ответ 17

Для меня это сделало трюк:

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

Ответ 18

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

Например, если вы нажимаете контроллер A на контроллер B, поместите пробел в панель навигации контроллера.

Ответ 19

Xcode 10, Swift 4+

Подобный ответ остальным здесь, но стоит отметить, что если текст все еще не очищен, вы должны нажать Пробел, а затем Enter.

enter image description here

Ответ 20

подробности

  • Версия 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 }
}

Результат

enter image description here

Ответ 21

В Xcode 9.2 с Swift это работало так:

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

Ответ 22

Для случая, когда мы не имеем никакого контроля над предыдущим контроллером представления (то есть, если мы работаем в платформе), мы можем удалить заголовок кнопки "Назад" следующим образом:

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

Ответ 23

Это решит вашу проблему:

    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)

    }
}

Ответ 24

Я попробовал пару ответов, и я не могу заставить их работать во всех случаях. Так что это обходной путь, который не влияет на заголовок панели навигации, если он установлен.

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

Ответ 25

Это работает для меня

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

Ответ 26

Я использовал этот код в функции Appdelegate didFinishLaunchingWithOptions.

if #available(iOS 11, *) {
            UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
            UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .highlighted)
        } else {
            UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0,
                                                                                           -60), for:UIBarMetrics.default)
        }

Ответ 27

Swift 5, Xcode 10.2

Я попробовал все методы (расширенный контроллер навигации и т.д.).. но в конечном итоге обнаружил, что проблема была из-за нажатия контроллера представления

До:

 self.navigationController?.pushViewController(vc, animated: false)

Решение:

self.navigationController?.pushViewController(vc, animated: true)

Это сработало для меня