self.navigationItem.backBarButtonItem 无法设置

Posted

技术标签:

【中文标题】self.navigationItem.backBarButtonItem 无法设置【英文标题】:self.navigationItem.backBarButtonItem cannot be set 【发布时间】:2016-03-22 07:37:42 【问题描述】:

我有一个名为 TVC 的 TableViewController 和一个单元格。当我单击单元格时,TableViewController 会将一个新的ViewController (VC) 推送到其导航控制器中。在这种情况下,我在 TVC 的viewDidLoad 函数中设置了[self.navigationItem.backBarButtonItem setTitle:@" "]。但是在新推的ViewControllerVC中,后退按钮还是有“后退”的文字。谁能解释一下?

顺便说一句,TableViewController TVC 也被另一个视图控制器 VC2 推送。我在VC2的viewDidLoad函数中设置了同样的函数[self.navigationItem.backBarButtonItem setTitle:@" "],TVC中显示的后退按钮文字被正确隐藏了。

【问题讨论】:

如果你在“VC”的viewDidLoad:方法中隐藏后退按钮? 我设置了backbuttonItem的外观(将文本颜色设置为与背景栏相同,并将字体设置为非常小),它适用于所有backbuttonItem。这是隐藏后退按钮文本的简单方法。 【参考方案1】:

Bimala 和 Ted 指出的是解决问题的两种方法。前者是设置一个自定义的BackButtonItem,后者是简单地使用默认的BackButton。但是将屏幕标题设置为“”可能并不总是可以接受的。所以你可以选择在 ViewWillDisappear 方法中做同样的事情。

OBJ C:

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

斯威夫特:

override func viewWillDisappear(animated: Bool) 
    self.title = ""
    super.viewWillDisappear(true)

您也可以在 ViewWillappear 中重新设置标题

OBJ C:

-(void)viewWillAppear:(BOOL)animated    
    [super viewWillAppear:animated];
    self.navigationItem.title = @"your title"; 

斯威夫特:

override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(true)
    self.title = "your title"

【讨论】:

谢谢。这是有道理的。我还找到了另一种通过设置 backbuttonItem 外观来​​实现此目的的方法。【参考方案2】:

这是因为后退按钮采用了前一个视图控制器的标题。如果没有设置,则默认为后退。所以将 TableViewController 的名称设置为空字符串如下:

override func viewDidLoad() 
    super.viewDidLoad()
    self.navigationItem.title = ""

【讨论】:

是的,我也想过这个问题。但是如果我从子视图返回,我仍然需要重置表格视图的标题。【参考方案3】:

这是我的例子:

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[leftView setBackgroundColor:[UIColor clearColor]];
UIButton *leftViewButton = [UIButton buttonWithType:UIButtonTypeCustom];
[leftViewButton setFrame:CGRectMake(0, 0, 30, 30)];
[leftView addSubview:leftViewButton];

[leftViewButton setImage:[UIImage imageNamed:@"NavigationBarButtonBackDefault"] forState:UIControlStateNormal];
[leftViewButton setImage:[UIImage imageNamed:@"NavigationBarButtonBackPressed"] forState:UIControlStateHighlighted];

UIBarButtonItem *barButtonItemLeft = [[UIBarButtonItem alloc] initWithCustomView:leftView];
self.navigationItem.leftBarButtonItem = barButtonItemLeft;

来自文档:

如果后退按钮的标题太长而无法放入导航栏上的可用空间,导航栏可能会用字符串“Back”代替按钮的原始标题。仅当前一个视图控制器提供后退按钮时,导航栏才会这样做。如果新的***视图控制器有一个自定义的左栏按钮项(leftBarButtonItems 或其导航项的 leftBarButtonItem 属性中的一个对象),则导航栏不会更改按钮标题。

【讨论】:

【参考方案4】:

如果你只是想隐藏后退按钮,那么试试:

self.navigationItem.hidesBackButton = YES;

self.navigationController.navigationBar.topItem.hidesBackButton = YES;

如果您想设置自定义后退按钮,请使用:

UIBarButtonItem *barButtonItem = [ [UIBarButtonItem alloc] initWithTitle: @"Custom"
                                                                   style: UIBarButtonItemStylePlain
                                                                  target: nil action: nil];
self.navigationController.navigationBar.topItem.backBarButtonItem = barButtonItem;

【讨论】:

以上是关于self.navigationItem.backBarButtonItem 无法设置的主要内容,如果未能解决你的问题,请参考以下文章