【问题标题】:How do I set the title of the NavigationItem/NavigationBar如何设置 NavigationItem/NavigationBar 的标题
【发布时间】:2013-07-16 20:53:46
【问题描述】:

我一直致力于在 Xcode 中设置与 iOS 邮件应用程序类似的 UI,但第二个弹出视图控制器无法正常运行。我正在尝试将“交易”导航栏的标题设置为帐户的名称,但它却设置了 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 属性

感谢大家的帮助

【问题讨论】:

  • 您想将标题Transaction 设置为DetailViewController?
  • 不行,我想给我的TransactionViewController设置和账户名匹配的title,DetailViewController应该保持不变
  • 本例中的标题为“新帐户”
  • 如果可能的话,我能想到的另一个解决方案是从 TransactionViewController 中访问表格单元格表示的特定 Account 对象。
  • 一个视图控制器从它的导航控制器继承它的导航栏,所以通常 self.navigationItem 应该得到那个项目,但万一它没有;尝试访问导航控制器,[self.navigationController.navigationItem.titleLabel setTitle:@""];未设置标题可能有多种原因。

标签: ios objective-c cocoa navigationbar


【解决方案1】:

它是self.navigationItem.title = account.name;。如果我看得很清楚,该表在MasterViewController 内,并且主控器有一个导航控制器作为根。

【讨论】:

  • 这不会更改详细信息,但仍不会将“交易”设置为“新帐户”
  • 后退按钮是否将标题更改为新帐户?
  • 是的,但帐户标题也会更改为“新帐户”。
  • 在交易中创建一个方法 setNavTitle:(Account *) account {} 并将我的代码放在那里。
【解决方案2】:

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

我用上面的代码设置了标题,但是标题设置错了viewController

听起来您正确设置了标题,但可能设置了错误视图控制器的标题。 看起来您在问题中提到的-tableView:didSelectRowAtIndexPath: 方法位于“主”视图控制器中,即屏幕左侧的那个,并且其transactionViewController 属性指向“细节”视图控制器。根据您的评论,我认为您正在“主”端创建一个新的视图控制器并将其推送到导航堆栈上,并且您希望该视图控制器具有“新帐户”的标题(否则选择的任何帐户的名称)。如果这一切都正确,那么您应该在代码中查找创建新控制器的位置并将 its navigationItem.title 设置为适当的字符串。

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

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

【讨论】:

  • transactionViewController 是我的主视图控制器中的一个属性,类型为TransactionViewController *。如何确保我拥有正确的视图控制器?
  • 你所描述的一切都是正确的,除了我使用故事板并使用表格单元格中的 segues 来推送新的视图控制器。这有很大的不同吗?我已经在界面生成器中设置了标题,但我想在运行时动态更改它。
  • @NicolaLucasBuescher 好的,我已经更新了答案,提供了有关如何使用故事板执行此操作的更多信息。
  • 感谢您的建议。我在父视图中设置标题,并最终使用了-prepareForSeque:sender: 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多