自定义UINavigationBar返回按钮且不带标题

238

如何在iOS 7及以上版本中定制没有标题的返回导航按钮?(即只有箭头)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

我只是想知道他们是否有任何self.backButtonItem; 或者类似这样的东西?

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

3
您可以使用 @hiroshi 的答案和导航栏 tintColor 属性来制作自定义颜色的 chevron(矢车菱形符号),而且没有任何标题。 - Dmitry Zhukov
对于那些拥有选项卡栏的用户,如果您不想要返回按钮的文本,则可以在TabBarController的**viewDidLoad()**中添加以下代码进行修复:self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) - Borzh
36个回答

2

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 = @"";
}

1
如果您有两个视图控制器(FirstVC,SecondVC)嵌入导航控制器,并且您希望在SecondVC中只有返回箭头,请尝试以下操作:在FirstVC的ViewDidLoad中添加以下代码:
override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

当你进入 SecondVC 页面时,你会发现只有一个返回箭头。


1
我成功的唯一方法是:
navigationController?.navigationBar.backItem?.title = ""

更新:

当我将segue动画标志更改为true(之前是false)时,唯一适用于我的方法是:

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

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
  1. 在UINavigationItem的左侧添加新的UIBarButtonItem
  2. 更改UIBarButtonItem的使用方式
  3. 现在,点击UINavigationItem并将barBackButtonItem从outlets向左滑动到left UIBarButtonItem

enter image description here


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
  • backItem.title = "" 改为使用 topItem.title = ""
  • 设置 navigationItem.hidesBackButton = truenavigationItem.leftBarButtonItem 将失去返回手势
  • 记得创建两个后退图标实例

我的解决方案将更改图像并保留返回手势:

navigationController?.navigationBar.backIndicatorImage = UIImage(named: "back")
navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "back")
navigationController?.navigationBar.topItem?.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后退箭头?我尝试了类似的东西,但它删除了箭头。 - Alejandro Figueroa
它在iOS 7中保留了返回箭头。在iOS 6中,传递一个空字符串(长度为0)也会完全删除按钮,因此这样做只对iOS 7真正有用。 - Dima
有一个非常简单的解决方案。看看我的答案是否适用于你。 - Guto Araujo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接