UINavigationBar自定义后退按钮,无标题


231

如何在没有标题的情况下自定义iOS 7及更高版本中的导航后退按钮?(即仅带有箭头)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

我只是想知道他们是否有任何self.backButtonItem;

要么

这样的东西?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
您可以使用@hiroshi答案+导航栏tintColor属性来制作具有自定义颜色且没有任何标题的人字形
Dmitry Zhukov 2013年

对于那些拥有标签栏并且不希望后退按钮文本的用户,解决方法是:在TabBarController 的viewDidLoad()中放置:self.navigationItem.backBarButtonItem = UIBarButtonItem(title:“”,style:。平原,目标:无,动作:无)
Borzh

Answers:


313

实际上很简单,这就是我要做的:

目标C

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

迅捷2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

迅捷3

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

将此行放在推入堆栈的视图控制器中前一个视图控制器)。现在,新按下的视图控制器后退按钮将显示您为initWithTitle放置的任何内容,在这种情况下,它是一个空字符串。


3
我用了这个,但是标题以动画的形式消失了?
user1010819 2013年

7
谢谢凯尔!我一直在寻找一种方法来重命名iOS 7中的默认后退按钮。我将其放在prepareForSegue视图控制器中,并且效果很好。
yiwei 2014年

1
@ user1010819这是预期的行为,当切换视图控制器时,barButtonItems会动画化。你想达到什么目的?
Kyle Begeman 2014年

1
@YiweiGao没问题!如果您知道正确的代码,那只是另一件事,它非常简单!我很高兴它有所帮助!
Kyle Begeman 2014年

3
我觉得这需要更新,它现在什么也不显示,默认情况下箭头不存在?
Mathijs Segers 2015年

198

我找到了一种简单的方法来制作带有iOS单箭头的后退按钮。

假设您有一个导航控制器从ViewB转到ViewA。在IB中,选择ViewA的导航栏,您应该看到以下选项:标题,提示和后退按钮。

ViewA导航栏选项

ViewA导航栏选项

诀窍是在以前的视图控制器(视图A)的选项中选择您的命运视图控制器后退按钮标题(ViewB )。如果您未填写“后退按钮”选项,iOS会自动将标题“后退”与上一个视图控制器的标题一起放置。因此,您需要用单个空格填充此选项。

在“后退按钮”选项中填充空间

在“后退按钮”选项中填充空间

结果:

结果:


欢迎使用Stack Overflow。如果您还没有,请看看我们的游览情况,并在帮助中心中阅读一些有关我们的工作方式的文章以及此处的一些社区习俗。如果您需要有关网站功能的任何帮助,请不要害怕进行搜索,然后在Meta Stack Overflow上提问(如果您仍然找不到答案)。谢谢,祝你好运!无论如何,您现在就可以发布图像... :)
澳洲航空公司94重磅

53
它有效,只需注意-您需要为上一个控制器(例如,导航控制器中的
rootViewController

确保您在ViewA中的导航项上未将“ hidesBackButton”设置为TRUE
shim

在我看来,如果演示控制器的标题足够长,则此方法有效-如果它是简短标题,则将使用它。
2014年

1
对我来说,只有当工作源和目的地的ViewController的NavigationItem都Back Button设置为单个空格字符(即两个ViewA和ViewB)
dcestari

72

只需使用图像!

OBJ-C

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

SWIFT 4

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

Icon-Back.png

图标背面

Icon-Back@2x.png

Icon-Back @ 2x

Icon-Back@3x.png

Icon-Back @ 23x


4
使用此解决方案,您似乎失去了“向后滑动”功能。
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = self可以保持回滑动手势的技巧
Victor Carmouze

我一直在寻找这个答案,也许就是我的一生,即动作选择器。

29

iOS7具有新的界面规则,因此在按下UIView时最好至少保留向后箭头。以编程方式更改“后退”文本非常容易。只需在推送视图之前添加以下代码即可(如果您使用的是StoryBoards,则可以准备):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

这将更改默认的“后退”文本,但将保留iOS7样式的后退箭头。您还可以在按下视图之前更改后退箭头的颜色:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

希望这对您有所帮助!


2
这确实非常有效,并且似乎比其他选项更好。例如,与其他答案不同,标题永远不需要重置为先前的值。
pr1001 2013年

26

您不需要做任何事情。您可以通过情节提要本身来实现相同目的。

只需转到根导航控制器并留出一个空格即可。切记不要让您想要不带标题的后退按钮的控制器,而要记住根导航控制器。

按照下面的图片。 这适用于iOS 7和iOS 8


我尝试过,它有效。但是我仍然无法在代码中更改标题。
玉王林

使用XCode7,但在xCode8-> ios10.X中不再起作用,我使用了@iwasrobbed方法
LucioB

所有的天才都很简单!
Illya Krit

22

尽管Kyle Begeman的答案完全可以解决问题,但在每个可能的视图控制器中都包含此代码是很烦人的。我最后得到一个简单的UINavigationItem类别。当心,这是小龙!对不起,我的意思是:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

1
我投票赞成,但后来决定改用更简单的技巧- [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault];来源)-可能不那么优雅,但
令人毛骨悚然的

2
认真地说,你们……不要放弃任何其他解决方案。实施解决方案@nicky作为类别发布,不要三思而后行。如果添加此Prefix.pch文件,这是一个很好的可重用解决方案,可以在整个应用程序中实现。Apple鼓励使用类别将方法添加到现有类中,您应尽可能利用此功能。
zmonteca'3

我认为这是最好的解决方案,无论如何,“ method_exchangeImplementation”有点不安全,请看一下:正确的方法以及本NSHipster的方法指南
AlessandroOrrù16年

@AlessandroOrrù在这种特殊情况下,这应该是安全的,因为混乱的方法是UINavigationItem自己的方法,不涉及继承。而且_cmd极不可能参与吸气剂。无论如何,这是一个好点。所以,如果您的项目中有众多繁琐的助手中的任何一个,请确保在此处也使用它。
secondcitysaint

21

编辑:2014-04-09:当我获得声誉时,我感到抱歉,因为我不再使用此技巧。我建议凯尔的答案。还要注意,selfof self.navigationItem.backBarButtonItem不是显示控制器,而是显示后退按钮,而是要返回的上一个视图控制器。

如果您不需要上一个视图控制器的标题文本,只需用空白字符串填充标题即可;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

这将防止在推入的视图控制器上显示人字形“后退”。

编辑:即使您使用非空白的标题文本,在viewWillAppear:工作中设置上一个视图控制器的标题,但弹出视图控制器时,标题可能会闪烁。我认为“ twitter应用程序”似乎做了更多的细微修改,以避免闪烁。


我这里唯一的问题是,当我按下导航栏以返回上一个视图时,标题变成空白。可以解决吗?
Alioo

@Alioo您是否尝试了我在“编辑”行中提到的内容?
hiroshi 2013年

20

此方法有效,但是即使您跳回前一项,它也会删除前一项的标题:

self.navigationController.navigationBar.topItem.title = @"";

只需viewDidLoad在推送的View Controller 上设置此属性即可。


17
即使您跳回前一个项目的标题,也将删除它的标题。不太好:(
Antzi 2013年

我设置了推送VC的标题,viewWillAppear因此始终设置正确。
Guto Araujo,

@GutoAraujo它可以工作,但是标题会在延迟1或2秒后重新出现,这使得UX效果不佳。
2014年

在xCode8-> ios10.X中,这似乎是解决该问题的唯一方法
LucioB

12

这就是我的方法,也是最简单,最有效的方法。

如果嵌入 Navigation Controller

迅捷3

viewDidLoad我将其添加到视图控制器中时,您希望后退按钮只是箭头。

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

这与@Kyle Begeman的答案的区别在于,您在视图控制器上调用此方法,希望后退按钮只是箭头,而不是在推入堆栈视图控制器上。


7

您无法以所需的方式访问导航backButtonItem,需要创建自己的后退按钮,如下所示:

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

当然,当然:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}

然后我们丢失了后退按钮上发生的漂亮的淡出动画
Kiddo

3
您需要使用遮罩才能平滑过渡。“ *如果要使用自定义图像替换默认V形,则还需要创建一个自定义蒙版图像。iOS7使用该蒙版使上一个屏幕的标题在导航过程中看起来从V形出现或消失。过渡。”
用户

3
@null,您将失去iOS 7的左右滑动手势!
Mazen Kasser 2013年

@user,我得到了自定义图像,但默认情况下,色泽为蓝色。如何不添加任何色调?谢谢
Mazen Kasser

7

目标: 自定义所有后退按钮UINavigationBar到一个白色图标上

步骤: 1.在AppDelete的“ didFinishLaunchingWithOptions”方法中:

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2. viewDidLoad在普通超ViewController类的方法中:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }

这显示了警告“隐式版本的SYSTEM_VESION _...”在C99中无效。
Jayprakash Dubey 2014年

7

SWIFT 4

对于那些希望创建自定义后退按钮并删除其标题的用户,请在视图控制器中使用以下代码推送新代码:

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

为了更通用,请执行以下操作:

  1. 创建一个通用函数,如下所示:

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. 然后在视图控制器中使用它,如下所示:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

来自iOS6的简单技巧也可以在iOS7上使用:

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

编辑: 不要使用此hack。有关详细信息,请参见评论。


6
不要使用此hack。Apple的代码在64位设备上存在一个错误,当您更改条形按钮标题偏移时,该错误将阻止出现模式视图。更多细节
zh。

嗯,设备上只有问题,而模拟器没有。
zh。

当使用Xcode 9 / iOS 11构建时,此hack不再起作用。“ <”将显得太低,并且在调试器中运行时您会看到打破的约束。
T'Pol

3

你可以用这个 只需添加一个UIButton作为custumview对我来说,这对我来说是完美的UIBarButtonItem

试试下面的代码

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

    UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];

    return item;
}

3
但是,这将在iOS 7中禁用向后滑动手势
user102008

3

UILabel为您的根视图控制器创建一个您想要的标题,并将其分配给视图控制器的navigationItem.titleView

现在,将标题设置为空字符串,然后按下的下一个视图控制器将具有一个不带文本的后退按钮。

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}

3

所有的答案都不能解决问题。在每个视图控制器中设置后退按钮标题是不可接受的,并且为标题添加偏移量仍然会使下一个视图控制器标题向右移动。

这是使用方法混乱的方法,只需为UINavigationItem创建新扩展

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}

将后退按钮设置为单词back,效果很好:self.navigationItem.backBarButtonItem.title = @“返回”;
Mike Zriel '16

你是什​​么意思 问题是关于从“后退”按钮删除文本?
jakub wolanski's

1
许多应用程序和Apple自己的应用程序都说“ <返回”,因此最好遵循标准。BigTakeAway和JustEat。
迈克·兹瑞尔

2

我在viewDidLoad中应用了以下代码,它可以工作:

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

只是为了更新我使用矢量图标


2

您可以子类化UINavigationController,将自身设置为委托,并在委托方法中设置backBarButtonItem。 navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end

2

将标题设为空

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

换回图片

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;

1

自iOS 5左右以来,我一直在使用此解决方案,没有任何问题。我做了一个在视图控制器中调用的实用程序函数。您需要在viewDidLoad或之后的任何位置进行。

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

在某些情况下,导航项可能已经存在,而在其他情况下,则需要创建它。这说明了这两种情况,而不会弄乱导航项标题。它允许您通过简单地传递来删除标题@""


1
这是正确的答案。没有技巧 这只是按照其应使用的方式使用iOS API来设置标题。将其设置为@“”以删除标题(经过测试,可以正常工作)。
n13

1

对我有用的唯一方法是:

navigationController?.navigationBar.backItem?.title = ""

更新:

当我将segue animation标志更改为true(以前是false)时,对我有用的唯一方法是:

navigationController?.navigationBar.topItem?.title = ""

1

如果您在导航控制器中嵌入了两个ViewController(FirstVC,SecondVC),并且希望在SecondVC中只有后退箭头。

您可以在FirstVC的ViewDidLoad中尝试

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

然后,当您进入SecondVC时,您会看到只有向后箭头


1

如果设置了NavigationBar的tintColor,则添加一个不带标题的自定义后退按钮图像,该颜色将反映图像的颜色。请点击此苹果文档链接。

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];


1

我写了一个扩展程序,以使其更容易:

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}

1

您可以在viewWillDisappear上将当前ViewController的标题更改为@“”,然后在再次显示该标题时将其重置为之前的名称。

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}

0

在第一个ViewController的prepareForSegue:方法中,将视图标题设置为@“”,因此,当按下下一个视图时,它将显示前一个ViewController标题,即@“”。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

唯一的问题是,当您按下“后退”按钮时,先前的视图将没有标题,因此您可以在viewWillAppear上再次添加它:

-(void)viewWillAppear:(BOOL)animated{
   self.navigationItem.title = @"First View Title";
}

我不太喜欢这种解决方案,但是它有效,而且我没有找到其他解决方法。


请参阅我的答案以获得正确的解决方案,而不会弄乱导航项目标题。
Dima

您的解决方案是否保持iOS7后退箭头?我尝试过类似的操作,但是它删除了箭头。
亚历杭德罗·菲格罗亚

它在iOS 7中保留后退箭头,是的。在iOS 6中传递一个空白(0长度)串也将删除按钮完全的,所以这这样做仅仅是为iOS 7真的好
迪马

有一个非常简单的解决方案。看看我的答案是否对您有用。
Guto Araujo,

0

为了补充托马斯·C的上述答案,有时放置单个空格是行不通的,您必须继续添加空格。

空栏按钮

当您在“导航项”下看到“条形按钮项-”时,您就会知道成功。在文档大纲中(编辑器->显示文档大纲)。看到上面的图片后,您可以删除一些空格并查看它是否仍然有效。


0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

就像Kyle Begeman所做的一样,您在根视图控制器上添加了上面的代码。将应用所有子视图控制器。另外,在initWithCoder:方法中添加此代码,您可以采用xib,情节提要或基于代码的方法将样式应用于根视图控制器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.