从保留图标的后退按钮中删除文本
Posted
技术标签:
【中文标题】从保留图标的后退按钮中删除文本【英文标题】:Remove text from Back button keeping the icon 【发布时间】:2015-10-08 20:20:24 【问题描述】:我想从后退按钮中删除文本,但我想保留图标。我试过了
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
但是,这会完全删除文本和图标。
【问题讨论】:
【参考方案1】:我知道这已经有了答案,但您也可以在代码中执行(以防您使用 nib)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
在第一个视图控制器中添加上述内容。
请注意,您需要为每个正在推送的视图控制器执行此操作。因此,如果您有 3 个视图控制器,并且您想从所有视图控制器中删除后面的文本,则必须在视图控制器 1 和 2 中添加该行。
【讨论】:
这是迄今为止我见过的最好的解决方案,不会给我带来任何麻烦.Plain
已更改为 .plain
。没有大写p。
完美..!这就是我想要的。
最佳解决方案。谢谢。
@GastónAntonioMontes,它确实适用于 ios13,但它有点反直觉:空标题 backBarButtonItem 应该在 pushing 视图控制器上声明,而不是 pushed 一个【参考方案2】:
@rmd2 的方法几乎是正确的,但您应该选择后退按钮将指向的控制器的导航栏,然后在后退按钮字段中输入" "
。
【讨论】:
最糟糕的方式,如果视图控制器没有导航栏,我将不得不添加以删除文本【参考方案3】:经过大量搜索,我找到了最佳和简单的解决方案,这将影响所有 用 Swift 4.2 编写并在 Swift 5 中工作的视图控制器
extension UIViewController
open override func awakeFromNib()
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
【讨论】:
像魅力一样工作 请注意,这仅在您的 ViewController 包含在 Storyboard 或 Nib 中时才有效... 一个天才的解决方案! 但要确保导航控制器的条形按钮项的色调颜色不是“清晰”。 这曾经对我有用,但不再适用(它仍然适用于 iOS 12 模拟器,只是不是最新的 iOS 13)...【参考方案4】:后退按钮的文本取决于主视图的标题。
诀窍是如果主视图消失则清除标题,如果再次显示则重新设置:
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"
【讨论】:
【参考方案5】:如果您想从推送的视图控制器中删除后退按钮的标题...
假设一个名为 SettingsVC 的类将推送 SubSettingsVC 然后在 subSettingsVC 后退按钮中将显示标题<Settings
所以为了删除“设置”后退按钮的文本并使其类似于<
你必须在 SettingsVC 中设置 backBarButtonItem 标题 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。
搜索控制器行为需要更新答案。例如,如果您使用单独的 resultsVC 并点击推送另一个 VC 的项目,则不会调用初始 searchController 中的 viewWillDisappear 方法,因此标题仍然存在
如果您正在为整个应用程序中的屏幕寻找解决方案,这不是一个好方法。 - 如果您将此代码添加到某些“基本视图控制器”,第一个视图控制器的 viewWillDisappear 将在第二个视图控制器的 viewDidAppear 之后被调用(您通常在其中设置标题)......这会弄乱标题。最好的方法是覆盖后退按钮
完美解决方案谢谢【参考方案6】:
如果你想要返回箭头,那么将下面的代码放入 AppDelegate 文件到 didFinishLaunchingWithOptions 方法中。
对于斯威夫特
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
【讨论】:
我喜欢这个,因为您可以在一个文件中标准化您的应用程序的样式,并从应用程序委托中调用一次 这是一个非常好的和快速的解决方案,但是......如果你有除后面之外的其他栏按钮项目,这可能会很棘手:) 一个观察,如果你只实现“.normal”属性,你会看到点击文本。为“.selected”、“.highlighted”和“.disabled”添加相同的行。以确保您看不到闪烁的文字。 我认为这会产生副作用,除了后退按钮之外的其他栏按钮也会受到影响,并且会有清晰的文本颜色:(【参考方案7】:就我而言,对于自定义图标和标题,这可以解决问题(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)
【讨论】:
该代码的最后一行对我来说完美无缺。所有其他建议都不起作用,可能是因为我的视图控制器都由导航控制器控制。在这种情况下,navigationController?确实需要。 如果要添加自定义后退按钮,则需要前四行。否则最后一行会成功。【参考方案8】:这对我有用
override func viewDidLoad()
super.viewDidLoad()
navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
【讨论】:
正确一个。在 ios 13 中,navigationItem.backBarButtonItem 不起作用。它节省了我数小时的努力。谢谢 这是唯一一个适用于 searchViewController 的情况【参考方案9】:终于找到了完美的解决方案。
只需添加一张透明图片并在您的 AppDelegate 中添加以下代码。
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
【讨论】:
这绝对是最好的答案。我以前使用过大多数其他答案推荐的UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment
hack,但它在 iPhone X 上被用于具有长标题的视图控制器。此解决方案完美无缺。
最佳答案。比透明文本颜色效果更好。
我在过去 4 年中使用的最佳解决方案!您只需在一个地方为所有视图控制器执行一次!!!
当我在 iOS 12 上尝试这个时,文本仍然出现在图像旁边。 :(【参考方案10】:
我通过在前一个 ViewController 的 StoryBoard Title 上添加一个“”解决了这个问题。只是一个空格,不是空的;D
【讨论】:
我需要前一个屏幕有一个标题,所以我想这对我不起作用。 我已将该标题设为空白,但标题仍在返回按钮标题中 不要空白标题,字段,在返回按钮字段中放置“”(空格)【参考方案11】:在 Swift 4 中
self.navigationController?.navigationBar.topItem?.title = ""
【讨论】:
谢谢,它帮助了我,(Swift 4.0,Xcode 10.1,iOS 12.1.1),谢谢 但是,您将在父 vc 中失去您的头衔 如果存在大标题,则 topItem 为大标题。不工作【参考方案12】:对于 Swift 4+,将这些行放入 AppDelegate
didFinishLaunchingWithOptions
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
【讨论】:
当您在应用程序委托中设置外观时,每个 UIBarButtonItem 都具有清晰的前景色,不是吗?因此,如果我添加一个带有文本的 UIBarButtonItem,我是否必须手动更改此按钮的前景色? 这很好,但是当你按下后退按钮时它仍然显示文本 它可以工作,但在 iOS 11 中使其他栏按钮消失。上面 Rafiqul Hasan 的回答可以解决问题【参考方案13】:如果你有一个 ViewControllerA 并且你想导航到 ViewControllerB,在 ViewControllerA 中,你应该将当前的 navigationItem 设置为一个新的 UIBarButtonItem 并将标题设置为一个带有空格的字符串,然后再推送到另一个视图控制器:
设置标题为带空格的字符串,不能设置nil或""(空字符串),因为默认值为nil
let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)
【讨论】:
我得到了一些非常有趣的行为,即使在ViewControllerB
中将标题设置为“”(并进行了检查)时,“返回”文本也会重新出现(尽管这一直有效,直到现在,在我的特殊情况下),这是唯一对我有用的解决方案【参考方案14】:
将此代码放入每个 VC 中,该 VC 会推送另一个
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
【讨论】:
【参考方案15】:您可以使用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)
【讨论】:
【参考方案16】: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
【讨论】:
【参考方案17】:从导航控制器堆栈中的所有视图控制器中删除:
子类 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)
【讨论】:
【参考方案18】:Xcode 10、Swift 4+
此处与其他人的回答类似,但值得注意的是,如果文本仍未清除,则必须单击 Space 然后 Enter。
【讨论】:
【参考方案19】:有时仅更改标题颜色是行不通的,以防标题很长。因为它可能会将导航栏标题向左移动。因此,为了防止它,您可能需要水平移动栏按钮标题以使其透明:
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
【讨论】:
【参考方案20】:这将解决您的问题:
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)
【讨论】:
这个没问题?!这也是正确的做法!谢谢【参考方案21】:详情
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
结果
【讨论】:
【参考方案22】:对我来说,这成功了:
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
【讨论】:
你能解释一下吗? 我有一个控制器,它总是显示带有返回按钮的返回文本。所以上面的代码在我的情况下不起作用【参考方案23】:您应该选择控制器的导航栏,从哪个返回按钮将指向并在返回按钮字段中键入“”。
例如,如果您将 A 控制器推送到 B 控制器,请将空格放在 A 控制器导航栏中。
【讨论】:
【参考方案24】:我尝试了几个答案,但无法让它们在所有情况下都有效。因此,如果设置了导航栏的标题,这是一种不影响导航栏标题的解决方法。
guard let items = viewController.navigationController?.navigationBar.items else return
for item in items
if item.title == nil
item.title = ""
【讨论】:
【参考方案25】:对我来说,覆盖所有ViewControllers
的另一种方法是扩展UINavigationController
并设置topViewController
的backBarButtonItem
。
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
【讨论】:
【参考方案26】:没有不必要的副作用的简单编程方式是在 source 的 awakeFromNib 方法中使用空项目初始化 navigationItem.backBarButtonItem strong> 控制器(您从中导航的那个):
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
【讨论】:
这是最好的方法。也适用于 iOS 14。【参考方案27】:以编程方式执行此操作的最简单方法是从父视图控制器(调用推送的控制器)设置backBarButtonItem
。
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/
【讨论】:
【参考方案28】: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
在 App delegate didFinishLaucnh 中添加此代码
【讨论】:
【参考方案29】:在带有 Swift 的 Xcode 9.2 中,它是这样工作的:
override func viewWillDisappear(_ animated: Bool)
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
【讨论】:
【参考方案30】:对于我们完全无法控制之前的视图控制器的情况(即如果我们在框架中工作),我们可以删除后退按钮的标题,如下所示:
// 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)
【讨论】:
以上是关于从保留图标的后退按钮中删除文本的主要内容,如果未能解决你的问题,请参考以下文章
如何从iOS中保留后退图标的LeftNavigation Bar按钮中删除后退文本[重复]