0

我一直在努力在 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 版本,同样的代码根本不会产生任何结果。

编辑:我实际上在本指南中找到了答案:在视图控制器之间传递数据

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

谢谢你们每一个人的帮助

4

2 回答 2

2

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

于 2013-07-16T21:10:39.380 回答
2

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

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

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

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

- (void)setAccount:(Account*)account
{
    if (account != _account) {
        _account = account;
        self.navigationItem.title = account.name;
    }
}
于 2013-07-16T21:02:29.763 回答