Удалить текст с кнопки "Назад", удерживая значок
Я хочу удалить текст с кнопки "Назад", но хочу сохранить значок. я пытался
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
Однако это полностью удаляет текст и значок.
33 ответа
Метод @rmd2 почти верен, но вместо этого вы должны выбрать панель навигации контроллера, на которую будет указывать кнопка возврата, и набрать " "
в поле кнопки "Назад".
Я знаю, что на это уже есть ответ, но вы также можете сделать это в коде (если вы работаете с перьями)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Добавьте вышеперечисленное в первый контроллер вида.
Обратите внимание, что вам нужно сделать это для каждого контроллера представления, который выдвигает. Так что, если у вас есть 3 контроллера представления, и вы хотите удалить задний текст из всех них, вам нужно будет добавить строку в контроллеры представления 1 и 2.
После поиска я нашел лучшее и простое решение, это повлияет на все viewControllers, написанные в Swift 4.2
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
Если вы хотите удалить заголовок кнопки "Назад" из контроллера push-представления, скажем, <Settings
в <
затем в subSettingsViewController необходимо установить заголовок backBarButtonItem в методе viewWillDisappear() метода SettingsViewController.
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(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Текст кнопки "Назад" зависит от заголовка основного вида.
Хитрость заключается в том, чтобы очистить заголовок, если основной вид исчезает, и установить его снова, если он отображается снова:
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"
}
Если вы хотите стрелку назад, следуйте следующему коду, помещенному в файл AppDelegate в метод didFinishLaunchingWithOptions.
Для Свифта
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
В моем случае для пользовательского значка и заголовка это помогло (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)
Это работает для меня
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Наконец-то нашли идеальное решение.
Просто добавьте одно прозрачное изображение и добавьте следующий код в ваш AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Я решил эту проблему, добавив " " в заголовок StoryBoard предыдущего ViewController. Просто пространство, а не пустое;D
В быстром 4
self.navigationController?.navigationBar.topItem?.title = ""
Для Swift 4+ поместите эти строки в AppDelegate
в didFinishLaunchingWithOptions
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
Вы можете удалить текст с кнопки возврата, используя метод делегата 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)
}
}
Поместите этот код в каждый VC, который выдвигает другой
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Если у вас есть ViewControllerA, и вы хотите перейти к ViewControllerB, в ViewControllerA вы должны установить текущий навигационный элемент с новым UIBarButtonItem и заголовок в строку с пустым пространством перед передачей в другой контроллер представления:
Установите заголовок для строки с пробелом, вы не можете установить nil или "" (пустая строка), потому что значение по умолчанию равно nil
let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)
Чтобы скрыть текст кнопки «Назад» глобально (iOS 14+):
extension UINavigationController {
open override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
navigationBar.topItem?.backButtonDisplayMode = .minimal
}
}
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
}
Xcode 10, Swift 4+
Подобный ответ остальным здесь, но стоит отметить, что если текст все еще не очищен, вы должны нажать пробел, а затем Enter.
Чтобы удалить из всех контроллеров представления в стеке контроллера навигации:
подкласс 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)
}
После долгих страданий единственное, что мне РАБОТАЛО, это:
Нажмите на свою кнопку в Storyboard/Xib
Поскольку каждой кнопке нужно имя (даже если вы не хотите отображать его в пользовательском интерфейсе), перейдите в IdentityInspector[ + +
4
] и на {Document-Label} напишите для него имя.В AttributeInspector[ + +] измените {Style} с «Обычный» на «По умолчанию» и {Type} на «Пользовательский».
И поскольку вы не показываете текст на кнопке Ui, в AttributeInspector[
Cmd
+Option
+5
] установите {Image} из ваших ресурсов.
Стройте, запускайте и хорошего дня!
Вам следует выбрать панель навигации контроллера, на которую будет указывать кнопка "Назад", и ввести " " в поле "Кнопка возврата".
Например, если вы нажимаете контроллер A на контроллер B, вставьте пробел в навигационную панель контроллера.
Иногда не удается изменить только цвет заголовка, если заголовок длинный. Потому что это может сместить заголовок панели навигации влево. Поэтому, чтобы предотвратить это, вам может понадобиться сдвинуть заголовок кнопки панели по горизонтали, чтобы сделать ее прозрачной:
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
Это решит вашу проблему:
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)
}
}
Одна альтернатива переопределить все 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
}
}
Детали
- 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 }
}
Результат
Я попробовал пару ответов, и я не могу заставить их работать во всех случаях. Так что это обходной путь, который не влияет на заголовок панели навигации, если он установлен.
guard let items = viewController.navigationController?.navigationBar.items else { return }
for item in items {
if item.title == nil {
item.title = ""
}
}
Версия Swift 5 удаляет заголовок кнопки возврата и устанавливает пользовательское изображение ios 13.0+
let backButtonAppearance = UIBarButtonItemAppearance(style: .plain)
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.backButtonAppearance = backButtonAppearance
navigationBarAppearance.setBackIndicatorImage(#imageLiteral(resourceName: "back"), transitionMaskImage: #imageLiteral(resourceName: "back"))
UINavigationBar.appearance().standardAppearance = navigationBarAppearance
Добавьте этот код в делегат приложения didFinishLaucnh
Простой программный способ без нежелательных побочных эффектов - это инициализация navigationItem.backBarButtonItem с пустым элементом в методе awakeFromNib исходного контроллера (того, с которого вы переходите):
override func awakeFromNib() {
super.awakeFromNib()
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Примечание. Если вы инициализировали кнопку "Назад" позже, как в методе viewDidLoad(), то потеряете функцию обратного смахивания (смахивание от левого края вправо возвращает вас на один шаг назад в стеке навигации).
Затем, если вам нужны разные тексты кнопок возврата для разных контроллеров назначения, и если вы используете переходы, вы можете установить заголовок в методе prepare(for 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
}
}
}
Самый простой способ сделать это программно - установить 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/
Для меня это сработало:
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, он будет работать. Но если вы попытаетесь вернуться назад с помощью жеста, а затем отменить и остаться на контроллере push-представления, обратный заголовок вернется.
Работа в Swift 4