Ответ 1
Метод @rmd2 почти верен, но вместо этого вы должны выбрать панель навигации контроллера, на которую будет указывать кнопка " "
Назад", и ввести " "
в поле "Кнопка возврата".
Я хочу удалить текст с помощью кнопки "Назад", но хочу сохранить значок. Я пробовал
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
Однако это полностью удаляет текст и значок.
Метод @rmd2 почти верен, но вместо этого вы должны выбрать панель навигации контроллера, на которую будет указывать кнопка " "
Назад", и ввести " "
в поле "Кнопка возврата".
Я знаю, что на это уже есть ответ, но вы также можете сделать это в коде (если вы работаете с перьями)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Добавьте вышеупомянутое в первом контроллере представления.
Обратите внимание, что вам нужно сделать это для каждого контроллера представления, который выдвигает. Так что, если у вас есть 3 контроллера представления, и вы хотите удалить задний текст из всех них, вам нужно будет добавить строку в контроллеры представления 1 и 2.
Если вы хотите удалить заголовок кнопки "Назад" из контроллера 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)
}
Текст кнопки "Назад" зависит от названия основного вида.
Хитрость заключается в том, чтобы очистить заголовок, если главный вид исчез и снова установите его, если он снова отображается:
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)
После поиска я нашел лучшее и простое решение, это повлияет на все viewControllers, написанные в Swift 4.2
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
Я решил эту проблему, добавив "" в заголовок StoryBoard предыдущего ViewController. Просто пробел, а не пустой, D
Наконец нашел идеальное решение.
Просто добавьте одно прозрачное изображение и добавьте следующий код в свой AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Для Swift 4+ поместите эти строки в AppDelegate
в didFinishLaunchingWithOptions
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
в быстром 4
self.navigationController?.navigationBar.topItem?.title = ""
Если у вас есть ViewControllerA, и вы хотите перейти к ViewControllerB, в ViewControllerA вы должны установить текущий навигационный элемент с новым UIBarButtonItem и заголовок в строку с пустым пространством перед передачей в другой контроллер представления:
Установите заголовок для строки с пробелом, вы не можете установить nil или "" (пустая строка), потому что значение по умолчанию равно nil
let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)
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
}
Поместите этот код в каждый VC, который выдвигает другой
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Чтобы удалить из всех контроллеров 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)
}
Иногда не удается изменить только цвет заголовка, если заголовок длинный. Потому что это может сместить заголовок панели навигации влево. Поэтому, чтобы предотвратить это, вам может понадобиться сдвинуть заголовок кнопки панели по горизонтали, чтобы сделать ее прозрачной:
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
Для меня это сделало трюк:
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
Вы должны выбрать панель навигации контроллера, с которой будет отображаться кнопка возврата, и введите "в поле" Назад".
Например, если вы нажимаете контроллер A на контроллер B, поместите пробел в панель навигации контроллера.
Xcode 10, Swift 4+
Подобный ответ остальным здесь, но стоит отметить, что если текст все еще не очищен, вы должны нажать Пробел, а затем Enter.
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 }
}
В Xcode 9.2 с Swift это работало так:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Для случая, когда мы не имеем никакого контроля над предыдущим контроллером представления (то есть, если мы работаем в платформе), мы можем удалить заголовок кнопки "Назад" следующим образом:
// 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)
}
Это решит вашу проблему:
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)
}
}
Я попробовал пару ответов, и я не могу заставить их работать во всех случаях. Так что это обходной путь, который не влияет на заголовок панели навигации, если он установлен.
guard let items = viewController.navigationController?.navigationBar.items else { return }
for item in items {
if item.title == nil {
item.title = ""
}
}
Это работает для меня
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Я использовал этот код в функции 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)
}
Swift 5, Xcode 10.2
Я попробовал все методы (расширенный контроллер навигации и т.д.).. но в конечном итоге обнаружил, что проблема была из-за нажатия контроллера представления
До:
self.navigationController?.pushViewController(vc, animated: false)
Решение:
self.navigationController?.pushViewController(vc, animated: true)
Это сработало для меня