当我按下UIViewController
时,它在新UIViewController
的后退按钮中有一些标题,如果标题有很多文字,它在iPhone 4s看起来不太好所以我想删除它
如果我在prepareForSegue
函数中添加一些代码,那将会很麻烦。
有更好的方法来实现这个目标吗?
答案 0 :(得分:108)
如果您想要后退箭头,请将代码放入AppDelegate
文件中didFinishLaunchingWithOptions
方法。
For Objective-C
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
For Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
下面给出另一个选项。
在Objective C
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
在Swift
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
更新:
let BarButtonItemAppearance = UIBarButtonItem.appearance()
let attributes: [NSAttributedStringKey: Any] = [
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
UPDATE SWIFT 4.1:
let attributes = [NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
使用偏移
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
所以可能你的问题已经解决了。
快乐的编码。
答案 1 :(得分:52)
工作就像Swift 3上的魅力
self.navigationController?.navigationBar.topItem?.title = " "
答案 2 :(得分:48)
我在add_image_size
文件中将此行代码用于width="222" height="440"
方法,以删除后退按钮AppDelegate
。
Swift 2.x
didFinishLaunchingWithOptions
Swift 3.x
title
Swift 4.x
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)
答案 3 :(得分:11)
只需要从其他ViewControllers所依赖的 Parent ViewController 开始。
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
答案 4 :(得分:7)
您可以使用xcode 8和swift 3.0
self.navigationController?.navigationBar.backItem?.title = " "
答案 5 :(得分:6)
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
在swift 3.0中使用了这行代码
答案 6 :(得分:5)
你可以为你想要这种行为的所有UIViewController
创建一个子类,并在子类的viewDidLoad
中创建一个子类:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(
title: "", style: .plain, target: nil, action: nil)
}
这样,您可以选择您希望行为的控制器,而无需重复代码。我更喜欢我的控制器只是说“后退”,而不是前一个控制器的标题,所以我在这里设置了这个标题。
答案 7 :(得分:5)
从rordulu's回答here获取灵感,我最终创建了一个自定义UINavigationController和UINavigation栏,似乎可以处理这个棘手问题的所有情况。
1)使用您的自定义UINavigationController
初始化新的UINavigationBar
:
class CustomNavigationController: UINavigationController {
convenience init() {
self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
}
}
2)每次视图自行设置时,将导航栏的backItem.title
属性设置为空字符串
class CustomNavigationBar: UINavigationBar {
override func layoutSubviews() {
backItem?.title = ""
super.layoutSubviews()
}
}
现在每次使用此导航控制器和条形组合时,它都不会有后退按钮文本!
注意:如果还使用故事板,这应该可以正常工作,只需确保将自定义导航栏组件放入视图中
答案 8 :(得分:5)
答案 9 :(得分:3)
我通常在UIViewController的viewDidLoad中添加或更改后退按钮。
这样的事情应该有效:
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton
不要忘记更改并实现调用它来关闭视图的功能。
更简单,只需更改标题:
self.navigationItem.leftBarButtonItem.title = "Back"
答案 10 :(得分:2)
简单解决方案:
从第一个控制器中推第二个控制器时,请将 self.navigationItem.title =“” 放入第一个控制器的 viewWillDisappear 中。隐藏第二个控制器的后退按钮标题。
上面的语句隐藏了第一个控制器的标题,因此当我们回来时,我们再次想要第一个控制器的标题。为此,我们在第一个控制器的 viewWillAppear 方法中为第一个控制器添加了标题。
请参阅(第一个控制器的)以下方法
override func viewWillDisappear(_ animated: Bool) {
self.navigationItem.title = ""
}
override func viewWillAppear(_ animated: Bool) {
self.navigationItem.title = "Title"
}
答案 11 :(得分:2)
现在,在iOS 14上,backButtonDisplayMode
类具有UINavigationItem
属性。因此,要删除后退按钮标题,您可以使用
navigationItem.backButtonDisplayMode = .minimal
在要删除它的viewController的viewDidLoad
函数中。
要在所有NavigationBar中将其删除,我使用了模糊处理技术
import UIKit
private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
extension UIViewController {
static func swizzle() {
let originalSelector1 = #selector(viewDidLoad)
let swizzledSelector1 = #selector(swizzled_viewDidLoad)
swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
}
@objc open func swizzled_viewDidLoad() {
if let _ = navigationController {
if #available(iOS 14.0, *) {
navigationItem.backButtonDisplayMode = .minimal
} else {
// Fallback on earlier versions
navigationItem.backButtonTitle = ""
}
}
swizzled_viewDidLoad()
}
}
在application(_:didFinishLaunchingWithOptions:)
通话中
UIViewController.swizzle()
答案 12 :(得分:2)
更新的Swift 4.2答案
使用UIAppearance
是解决问题的一种更干净的方法,但是它将导致所有UIBarButtonItem
的文本清晰。该解决方案的改进版本可以是检查UIBarButtonItem
中是否包含UINavigationBar
。
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
答案 13 :(得分:2)
Swift 4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
答案 14 :(得分:2)
斯威夫特3:
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
答案 15 :(得分:1)
只需将此代码复制到didFinishLaunchingWithOptions launchOptions
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
答案 16 :(得分:1)
iOS13的一种方法。
let backButtonAppearance = UIBarButtonItemAppearance(style: .plain)
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.backButtonAppearance = backButtonAppearance
UINavigationBar.appearance().standardAppearance = navigationBarAppearance
答案 17 :(得分:0)
class NavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
super.pushViewController(viewController, animated: animated)
viewController.navigationItem.backButtonTitle = ""
}
}
答案 18 :(得分:0)
您可以将此扩展名添加到UIViewController 然后在每个viewDidLoad()中调用此函数 喜欢:self.updateBackButton()
extension UIViewController {
func updateBackButton(){
if self.navigationController != nil {
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
}
}}
答案 19 :(得分:0)
我找到了一个简单的解决方案:-
在PersingtingViewController's
viewWillDisappear
方法jsut put
self.title = ""
并在title
方法上为PersingtingViewController's
设置viewWillAppear
。
并对viewControllers
中的所有navigationStack
重复此操作,最后一个除外。
答案 20 :(得分:0)
在viewDidLoad()
let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backBarButtonItem
答案 21 :(得分:0)
对于那些不想使用方法混乱或在不同的视图控制器中复制相似代码的人,我有一个简单的解决方案。
要删除后退按钮标题,请创建UINavigationController子类并重写pushViewController(_,animation :)方法:
final class CustomNavigationController: UINavigationController {
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
super.pushViewController(viewController, animated: animated)
let backBarButtonItem = UIBarButtonItem()
backBarButtonItem.title = nil
viewController.navigationItem.backBarButtonItem = backBarButtonItem
}
}
答案 22 :(得分:0)
在 Swift 5 上工作:
self.navigationItem.backBarButtonItem?.title = ""
请注意,它将对下一个推送的视图控制器有效,而不是显示屏上当前的视图控制器,这就是为什么它非常令人困惑!
此外,检查情节提要,然后选择上一个视图控制器的导航项,然后在后退按钮(检查器)中键入一些内容。
答案 23 :(得分:0)
将以下代码放入任何UIViewcontroller extension
中,它将隐藏所有UIViewcontroller
的后退文本
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
答案 24 :(得分:0)
只需使用覆盖函数UIViewController
创建awakeFromNib()
的扩展名,并为UIBarButtonItem
添加一个空标题,然后赋予navigation backBarButtonItem
。
extension UIViewController {
open override func awakeFromNib() {
let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backBarBtnItem
}
}
答案 25 :(得分:0)
快速4,5
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
答案 26 :(得分:0)
Swift 4.2和5
如果您稍后在代码中的任何时间使用图像选择器,则不必玩导航栏色彩,这会产生副作用。
使用以下代码:
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
从您的第一个ViewController调用它:
self.awakeFromNib()
答案 27 :(得分:0)
适用于 Swift 4.2
使用AppDelegate
文件中的代码行到didFinishLaunchingWithOptions
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)
答案 28 :(得分:0)
我想分享一个对我有用的解决方案。另外,可以根据您的需求和要求进行调整。
请注意,就我而言,我使用情节提要来指定CustomNavigationBar
Swift 4.2
class CustomNavigationBar: UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
guard let topItem = topItem else { return }
removeBackButtonTitle(for: topItem)
}
override func pushItem(_ item: UINavigationItem, animated: Bool) {
removeBackButtonTitle(for: item)
super.pushItem(item, animated: animated)
}
func removeBackButtonTitle(for item: UINavigationItem) {
item.backBarButtonItem = UIBarButtonItem()
}
}
答案 29 :(得分:0)
我不知道为什么但是我发现在iPhone上隐藏按钮标题的问题但在没有加号的设备中显示正确
leftBarButtonItem.title = ""
所以我找到了简单的方法。在autolayout中设置要在NavigationViewController的NavigationBar中清除的色调颜色。如果您使用带有色调的图标或文本图块,则可能会出现问题。但在我的情况下,我并没有全部使用它。
答案 30 :(得分:0)
请使用:
func removeBackButton(vc:UIViewController) {
let button = UIButton.init(type: .custom)
button.setImage(UIImage.init(named:""), for: .normal)
let leftBarButton = UIBarButtonItem.init(customView: button)
vc.navigationItem.leftBarButtonItem = leftBarButton
}
所以在viewDidLoad中调用此方法:
override func viewDidLoad() {
super.viewDidLoad()
removeBackButton(vc:self)
}
答案 31 :(得分:-4)
我对setBackButtonTitlePositionAdjustment
解决方案不满意,所以这里有一个快速的替代方法可以隐藏整个应用程序中的所有后退按钮文本:
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)
您必须从AppDelegate
func中的didFinishLaunchingWithOptions
拨打这些内容。
外观也必须设置为.Highlighted
状态,以避免在用户点按后退按钮时显示文字。