如何更改UINavigationBar返回按钮的文本

19

我目前正在尝试更改加载在表格单元格触摸后的子视图的返回按钮文本。然而,即使按照我尝试实现的方式,它仍然显示父视图的标题。

我正在尝试在viewdidload方法中加载一个新值到返回按钮中,如下所示:

UIBarButtonItem *myBarButtonItem = [[UIBarButtonItem alloc] init];
myBarButtonItem.title = @"Back";
self.navigationItem.backBarButtonItem = myBarButtonItem;
[myBarButtonItem release];

然而它并没有起作用。


这是在主线程上执行吗? - Jordaan Mylonas
说实话,我不确定iOS中的线程,如果这能回答你的问题,我没有创建线程。 - C.Johns
1
重复的问题。请参考此答案:https://dev59.com/U3I95IYBdhLWcg3wsQFm#4291832 - Yoga
可能是重复的问题:如何更改导航栏上“返回”按钮的标题? - Oded Ben Dov
10个回答

30

你需要从前一个视图中更改self.navigationItem.backBarButtonItem,而不是当前视图(我知道,这似乎有点不合逻辑)。例如,在你的表视图中,你可以这样做:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setTitle:@"My title"];
    UIBarButtonItem *boton = [[UIBarButtonItem alloc] initWithTitle:@"Custom back button text" style:UIBarButtonItemStyleBordered target:self action:@selector(mySelector:)];
    self.navigationItem.backBarButtonItem  = boton;
    [boton release];
}

不过如果他用西班牙语写的话就不一定了 ;) - Steee

26
这里的文档并不清晰,直到你阅读、重复阅读并尝试每个设置才能理解。
要更改默认返回按钮的标题,请在viewDidLoad()中添加此行代码。
self.navigationController.navigationBar.topItem.title = @"Your Label";

如果您想让按钮不可见-那么将值设置为@""空字符串即可。

2
这种方法很取巧,但是如果你回到之前的 nib 时重新设置它的标题,它就能起作用。 - Jake Long
被踩了。考虑到其他选项,这不应该被视为可行的解决方案。如果我们面临着对后退按钮行为缺乏控制的情况,那么这将是一个可以接受的 hack,但仍然是 hack。 - Fábio Oliveira
TopItem并不总是一个返回按钮,在我的一个案例中,TopItem是视图标题。 - Pat Long - Munkii Yebee

9

好的,我弄清楚了。我把这段代码发布在父视图tableView:didSelectRowAtIndexPath:方法中。这是我的代码样式,其中包含多个用户可以选择的表格单元。希望这可以帮到你。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    if (indexPath.section == 0) { //--- picks (first) section

     ChildViewController *childViewController = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:childViewController animated:YES];
    //--- this sets the back button to "Back" every time you load the child view.
     self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil] autorelease];

        if(indexPath.row == 0) { //--- picks row
            childViewController.title = @"Bike";
        }
        if(indexPath.row == 1) {
            childViewController.title = @"Model";
        }
        [vehicleSearchResponseTableViewController release];
    }


}

如果您在堆栈上有多个视图控制器,这是唯一真正有效的解决方案。谢谢。 - neowinston

2

Xcode 5中更改返回按钮名称的最佳方法是编辑导航控制器上视图控制器的导航项中的“Back Button”字段。例如,如果您有一个列表TableViewController,它转到详细信息屏幕,则可以在列表TableViewController的导航项(在IB中)上更改“Back Button”以更改详细信息屏幕显示的返回按钮名称。


这是你想要的方式。谢谢Peter。 - JVillella

1

你现在这样做是行不通的。导航按钮将始终具有上一个视图的标题。但你可以在推入新视图之前更改第一个视图的标题。这是我找到的唯一解决相同问题的方法。


1
然后当你回来时,你必须把标题改回来... 如果这是唯一的可能性,那么这是一个可怕的解决方案... 祈祷还有另一种方法。 - C.Johns

0
你的代码目前看起来很好。 这段代码在

之前执行吗?
[super viewDidLoad];

语句(错误)或之后(正确)?


0

我的建议是在父级页面标题栏上添加一个单独的标签。 对我来说这很好用。

let titleLabel = UILabel(frame: CGRect(x: (view.frame.width * (3/8)), y: 0, width: (view.frame.width * 0.25 ), height:30))
        titleLabel.text = "Title"
        titleLabel.textAlignment = .center
        titleLabel.textColor = UIColor.white
        titleLabel.font = UIFont.systemFont(ofSize: 20)
        navigationItem.titleView = titleLabel 

0

在viewDidLoad之后

self.navigationController!.navigationBar.backItem?.title = "返回"


-1

这篇文章应该能满足你的需求。

作者说:

如上所述,你只需要设置控制器的leftBarButtonItem,它就会隐藏返回按钮。选择器handleBack现在处理返回事件,然后你需要手动将视图控制器从UINavigationController的堆栈中弹出。你可以在那里实现任何自己的代码,甚至阻止离开页面。


-3
一个好的方法是在调用子视图控制器之前,在父视图控制器中设置返回按钮的标题,像这样:
[self.navigationItem.backBarButtonItem setTitle:@"Your Custom Title"];

这个标题将被放置在子视图的返回按钮中。重要的一点是,在子视图中,此标题用作返回到父视图的返回按钮。


根据您的解释,您是不是指的是 [self.navigationItem setTitle:@"..."] 或者甚至只是 'self.title = @"..."'? - Oded Ben Dov
1
默认情况下,self.navigationItem.backBarButtonItem 是空的,因此您不能使用它来更改返回按钮。 - Peter

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