我想从“后退”按钮中删除文本,但我想保留该图标。我努力了
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
但是,这将完全删除文本和图标。
我想从“后退”按钮中删除文本,但我想保留该图标。我努力了
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
但是,这将完全删除文本和图标。
Answers:
我知道这已经有了答案,但是您也可以通过代码来完成(以防您正在使用笔尖)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
将以上内容添加到第一个视图控制器中。
请注意,您需要对要推送的每个视图控制器执行此操作。因此,如果您有3个视图控制器,并且要从所有视图控制器中删除背景文本,则必须在视图控制器1和2中添加该行。
.Plain
已更改为.plain
。没有大写p。
经过大量搜索后,我发现了最佳,简单的解决方案,这将影响所有用Swift 4.2编写并在Swift 5中运行的viewControllers
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
后退按钮的文本取决于主视图的标题。
技巧是在主视图消失时清除标题,并在再次显示时重新设置标题:
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"
}
如果你想从一个推视图控制器删除后退按钮的标题,比方说<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)
}
.Plain
已更改为.plain
。没有大写p。
如果要返回箭头,则将以下代码放入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)
终于找到了完美的解决方案。
只需添加一个透明图像,然后在AppDelegate中添加以下代码即可。
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment
大多数其他答案所建议的技巧,但是对于带有长标题的视图控制器,它在iPhone X上已损坏。该解决方案完美无缺。
迅速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)
如果您有ViewControllerA,并且要导航到ViewControllerB,请在ViewControllerA中将当前的NavigationItem设置为新的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
}
要从导航控制器堆栈中的所有viewcontroller中删除:
子类化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控制器,请将空格放在A控制器导航栏中。
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 }
}
一种替代覆盖所有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
}
}
以编程方式执行此操作的最简单方法是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/
您可以使用的委托方法从“后退”按钮删除文本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)
}
}
在带有Swift的Xcode 9.2中,它的工作方式如下:
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)
}
}
一种简单的编程方式(没有副作用)是在源控制器的aakeakeFromNib方法(您要从中导航的方法)的aakeakeFromNib方法中用一个空项目初始化navigationItem.backBarButtonItem:
override func awakeFromNib() {
super.awakeFromNib()
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
注意:如果稍后像在viewDidLoad()方法中那样初始化后退按钮,则会失去后退功能(从左边缘向右滑动会使您在导航堆栈中后退一步)。
然后,如果要为不同的目标控制器使用不同的后退按钮文本,并且使用的是segues,则可以在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
}
}
}