在UINavigationBar上创建一个自定义的左侧返回按钮,并保留左侧标准箭头。

28

当我创建自定义的返回按钮时,我使用以下代码:

    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithTitle:@"Yeah" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonPressed:)];
self.navigationItem.leftBarButtonItem = leftButton;

这很好地运行着,我获得了这个结果:

当返回按钮是标准的而不是自定义的时,'Details'一词后跟随的标准后退箭头的截图。

我希望得到相同的结果,但左侧有一个箭头,就像这样:

标准后退箭头后跟 'Details' 一词的截图。

我该如何简单地添加此箭头?

6个回答

29

最后,这是我用来在当前视图中定义返回按钮标题的代码片段,带有标准左箭头,而不是在父视图中

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setTitle:@"Current View"];

    // Get the previous view controller
    UIViewController *previousVC = [self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count - 2];

    // Create a UIBarButtonItem
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"FooBar" style:UIBarButtonItemStyleBordered target:self action:@selector(yourSelector)];

    // Associate the barButtonItem to the previous view
    [previousVC.navigationItem setBackBarButtonItem:barButtonItem];
}

这是结果:

在此输入图片描述

注意:然而,由于无法在backBarButtonItem上添加操作,如果您需要,可以参考这篇很棒的文章

针对Swift更新

// Prev - no chevron...
//navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back !", style: .plain, target: self, action: #selector(backPressed))

// adds the chevron
let vc = navigationController?.viewControllers.first
let button = UIBarButtonItem(title: "Go Back", style: .plain, target: self, action: #selector(backPressed))
vc?.navigationItem.backBarButtonItem = button

1
哇哦!我无法告诉你我已经寻找这个解决方案多长时间了...谢谢。运行得非常好... - Stephan
5
这个动作有效吗?我正在尝试这种方法,但对我来说该动作没有被调用。我的iOS版本是11.4。 - Tap Forms
@TapForms 我在注释中添加了一条关于这个的说明。你是对的,它不起作用,可以查看这篇帖子 https://dev59.com/k3M_5IYBdhLWcg3w02v8#19132881 - Jonathan F.

17

最简单的方法是在父控制器(即您希望返回到的控制器)中设置标题。如果您不想让这个标题与VC视图中实际显示的标题相同,则可以在viewWillDisappear中将标题更改为您想要的下一个VC的后退按钮,并在viewWillAppear中将其更改回您想要的父级标题。

如果您正在使用Storyboard,您也可以直接在IB中设置返回标题。

最后,为了创建自定义返回按钮,您可以执行以下操作:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Details" style:UIBarButtonItemStyleBordered target:nil action:nil];

只需确保在呈现视图控制器(或父级视图控制器)中执行此操作,而不是正在加载的视图控制器(被呈现的控制器)。


我自己也经历过很多次。不要自责。这是一个庞大的框架,很容易忽略显而易见的问题。 - Bladebunny
6
然而,我认为有必要明确指出,使用backBarButtonItem而不是leftBarButtonItem时无法设置操作。 - Jonathan F.
进一步调查后更新了答案。 - Bladebunny

3
UIButton * backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton addTarget:self action:@selector(popViewController) forControlEvents:UIControlEventTouchUpInside];
[backButton setFrame:FRAME_DEFINE
[backButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[backButton setExclusiveTouch:YES];
[backButton setImage:[UIImage imageNamed:BACK_BUTTON_DEFAULT_ICON] forState:UIControlStateNormal];
[backButton setTitle:@"BACK" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
UIBarButtonItem *backMenuBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = backMenuBarButton;

有一个错误,但是你的回答帮了我。@"BACK - Andrei Marincas

0

对于Swift,基于Erzekiel的答案,您可以将其简化为 -

extension UIViewController {

    func setBackButtonTitle(to title: String) {
        let barButtonItem = UIBarButtonItem(title: title, style: .plain, target: self, action: nil)
        self.navigationItem.backBarButtonItem = barButtonItem
    }
}

这应该从父视图控制器中调用,例如在viewWillDisappear中 -

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.setBackButtonTitle(to: "Back"))
}

0

好的,你需要使用背景图片和标题

// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(backAction)];

tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];

0

我使用类似以下的代码:

UIBarButtonItem *leftBar = [[UIBarButtonItem alloc] init];
leftBar.title = @"Back";//Details
self.navigationController.navigationBar.topItem.backBarButtonItem = leftBar;

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