如何设置NavigationItem / NavigationBar的标题

时间:2013-07-16 20:53:46

标签: ios objective-c cocoa navigationbar

我一直致力于在Xcode中设置一个与iOS邮件应用程序类似的UI,但第二个popover视图控制器不会发挥作用。我试图设置"交易"的标题。导航栏到帐户名称,但它设置了DetailViewController的标题:

在我选择帐户之前:http://i.stack.imgur.com/zo75V.png

在我选择"新帐户":http://i.stack.imgur.com/8DPBB.png

之后
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Account *account = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    self.transactionViewController.navigationItem.title = account.name;
}

我使用上面的代码设置标题,但标题设置为错误的viewController ... 这个相同的代码根本不会产生iPhone版本的结果。

编辑: 我实际上在本指南中找到了答案:Passing Data between View Controllers

关键是使用-prepareForSegue:sender:方法获取正确的viewController并设置其标题。这也允许您在使用segue在它们之间切换时将任何数据从一个ViewController传递到另一个ViewController,我现在用它来设置事务帐户并将帐户名设置为seque.destinationViewController.navigationItem.title属性

谢谢大家的帮助

2 个答案:

答案 0 :(得分:2)

每个视图控制器都有navigationItem属性,每个导航项都有title属性。要设置视图控制器导航栏中显示的标题,您只需设置视图控制器的navigationItem.title,就像您正在做的那样。

  

我使用上面的代码来设置标题,但标题设置为错误的viewController

听起来你正确设置标题,但可能设置了错误的视图控制器的标题。 看起来像你在问题​​中提到的-tableView:didSelectRowAtIndexPath:方法是在“主”视图控制器中,即屏幕左侧的那个,以及它的transactionViewController }属性指向“详细信息”视图控制器。从你的评论中,我认为你正在“主”方面创建一个新的视图控制器并将其推送到导航堆栈,而那个视图控制器你想要标题为“新帐户”(或者是选择任何帐户的名称)。如果这一切都正确,那么您应该在代码中查找创建新控制器的位置,并将 navigationItem.title设置为相应的字符串。

一个重要的问题是:试图设置新视图控制器标题的对象是什么?在上面的代码中,您尝试从父控制器执行此操作。由于您正在使用故事板并且新的视图控制器是由segue创建的,因此您无法从...didSelectRowAtIndexPath...方法轻松访问新的视图控制器。如果要继续在父级中设置标题,可以实现-prepareForSegue:sender:来设置标题。另一方面,任何视图控制器都应该或多或少地负责它自身的呈现方式,因此您可以考虑让子视图控制器设置自己的标题,而不是让父视图执行它。父级可能已使用-prepareForSegue:sender:在子视图控制器中设置帐户。也许孩子有一个account属性,父母要求设置此信息?您可以为该属性实现setter来设置视图控制器的标题:

- (void)setAccount:(Account*)account
{
    if (account != _account) {
        _account = account;
        self.navigationItem.title = account.name;
    }
}

答案 1 :(得分:2)

self.navigationItem.title = account.name;。如果我看得清楚,该表位于MasterViewController内,并且主机具有导航控制器作为根。