问题 如何重新加载导航栏


UITableView 我配置 self.navigationItem.leftBarButtonItem 用一个按钮。现在我想重新加载此按钮以更新此按钮上的文本,但它已打开 Navigation bar。我可以更新 UITableView 通过

 [self.tableView reloadData]

但如何更新导航栏?

更新:我没有初始化按钮的标题,但重新加载它。所以任何初始化代码(例如 self.navigationItem.leftBarButtonItem.title = @"balabala")不起作用,因为它不会立即生效。


9251
2018-02-02 11:20


起源

你能发布一些你已经尝试过的代码吗?它是从主线程调用的吗? - jszumski
我有类似的问题,点击刷新按钮后我想在导航项目中设置标题,包括最后更新时间戳。我试过打电话 [titleView setNeedsDisplay];,也在主线程上,但标题不会更新几秒或直到执行任何segue,而 [self.tableView reloadData] 重新加载就好了。 - dev-null-dweller
嗨dev-null,是导航控制器当前显示的UIViewController吗?如果是这样,您应该能够(如某些答案中所述)通过使用来更改标题 self.navigationItem.title = @"New TITLE!"; 如果这不起作用,可能会有一些解释(比如 self 不是navigationController当前在其容器中显示的那个 - Marc-Alexandre Bérubé
self 是我的UiTableViewController,嵌入在导航控制器中。当我从其他控制器更改标题时(在 prepareForSegue),目标视图显示正确的标题,但当当前显示的视图控制器尝试更改标题时,它需要几秒钟在导航栏中显示新值。 - dev-null-dweller


答案:


只需更改leftBarButtonItem上的文本?

self.navigationItem.leftBarButtonItem.title = @"Back"; // or whatever text you want

2
2018-02-02 11:24



谢谢,但它不起作用 - Yuwen Yan


尝试这个

UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                               initWithTitle:@"Title" 
                               style:UIBarButtonItemStyleBordered
                               target:self
                               action:@selector(OnClick:)];
self.navigationItem.leftBarButtonItem = btnBack;

希望这有助于你..

编辑: -

UIBarButtonItem *btnBack = [[UIBarButtonItem alloc] initWithTitle: @"Title" style: UIBarButtonItemStyleBordered target:self action:@selector(OnClick:)];

[[self navigationItem] setBackBarButtonItem: btnBack];

2
2018-02-02 11:26



谢谢,但它不起作用 - Yuwen Yan
@ybbaigo我添加了另一种方式,尝试一下,让我知道这是否有效? - P.J
非常感谢,但根据我的理解,除非按下视图,否则backBar不会显示在导航栏上,我想一直在导航栏上显示此按钮。 - Yuwen Yan
不,当您调用上面的代码并且使用了导航控制器时,此代码将更改您设置为btnBack的导航控制器按钮文本。注意这里我不是创建导航栏,我只是创建一个UIBarButtonItem。如果您有任何疑问,请告诉我.. - P.J
抱歉需要很长时间才能回复。有一件事我想和你确认一下:你们两种方法之间的区别是什么?从leftBarButtonItem到backBarButtonItem?使用第二种方法(backBarButtonItem),按钮不会显示在导航栏上 - Yuwen Yan


尝试这个:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
                                   initWithTitle:@"your_title"
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(backBtnPressed:)];
    self.navigationItem.leftBarButtonItem = backButton;

2
2018-04-24 09:29



不要忘记在答案中添加解释。 - ρss
有关如何在navigationItem中替换titleView的任何提示? - dev-null-dweller


您尝试使用设置文本吗?

self.navigationItem.leftBarButtonItem.title

1
2018-02-02 11:27



谢谢,但它不起作用 - Yuwen Yan


您需要使用以下语句:

self.navigationItem setLeftBarButtonItem:cancelButton animated:YES];  

换句话说,你需要setLeftBarButtonItem:动画 消息而不是标准消息。这将使用动画重新加载按钮文本。如果您有兴趣在某个时刻更改,则同样适用于后退按钮。


1
2018-05-27 21:35





 @interface Myviewcontroller : UIViewController
{
       UIBarButtonItem *barBtnBack;
       UIButton *btnQuestion;
}

// viewDidLoad中

 btnQuestion = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 20, 25)];
        [btnQuestion setBackgroundImage:[UIImage imageNamed:@"question-mark2x"] forState:UIControlStateNormal];
        [btnQuestion addTarget:self action:@selector(goBacktomain)
              forControlEvents:UIControlEventTouchUpInside];
        barBtnBack =[[UIBarButtonItem alloc] initWithCustomView:btnQuestion];
    [self.navigationItem setLeftBarButtonItem:barBtnBack];

注意 - 当您想要更改navigationnar按钮标题时更改btnQuestion标题


1
2018-04-23 14:50





如果要更改NavigationBar标题,请尝试以下方法之一:

[self.navigationController.navigationItem setTitle:@"Title"];
[self.navigationItem setTitle:@"Title"];
[self setTitle:@"Title"];

如果您想更改按钮标题,请将其放在同一个类中:

- (void)setLeftBarButtonTitle:(NSString *)title action:(SEL)selector
{
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStyleBordered target:self action:selector];
    [self.navigationItem setLeftBarButtonItem:leftButton];
}

- (void)setRightBarButtonTitle:(NSString *)title action:(SEL)selector
{
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStyleBordered target:self action:selector];
    [self.navigationItem setRightBarButtonItem:rightButton];
}

设置按钮标题和操作的示例:

// Change button titles and actions any time
[self setLeftBarButtonTitle:@"Back" action:@selector(goBack)];
[self setRightBarButtonTitle:@"Something" action:@selector(doSomething:)];

// Change button titles with no actions
[self setLeftBarButtonTitle:@"Nothing" action:nil];
[self setRightBarButtonTitle:@"Nothing" action:nil];

// Remove buttons from navigation bar
[self.navigationItem setLeftBarButtonItem:nil];
[self.navigationItem setRightBarButtonItem:nil];

1
2018-04-23 15:31



@ dev-null-dweller试试上面的内容并告诉我们? :) - emotality
我试过了,但他们还需要一些时间来显示新标题:( - dev-null-dweller