在prepareForSegue方法中如何设置目标视图控制器的标题?

8
我想在目标视图控制器上设置标题,以便在prepareForSegue:方法中显示在其导航控制器的导航栏中,但是像这样设置它的标题或navigationItem:

[segue.destinationViewController setTitle:@"doesn't work"]; [segue.destinationViewController.navigationItem setTitle:@"this either"];

这不起作用,可能是因为目标视图控制器的视图尚未加载。我是否可以在不创建自定义目标视图控制器的情况下完成此操作?
4个回答

11
尝试像这样访问嵌入在 UINavigationController 中的 ViewController 。首先,在接口生成器中为您的segue命名标识符,然后在 prepareForSegue 方法中访问segue,并通过访问您跳转到的导航控制器的 topViewController 属性来设置标题。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"yourSegueIdentifier"]) {
        UINavigationController *navController = 
           (UINavigationController*)[segue destinationViewController];
        YourViewController *destViewController = 
           (YourViewController* )[navController topViewController];

        destViewController.navgationItem.title.text = @"Your new title";
    }
}

2
谢谢。这并不完全是我的问题,也不能解决我的问题,但它提醒我源视图控制器在容器视图中,然后再放在导航视图控制器中。所以我只需要在我的视图堆栈中引用正确的导航控制器即可。 - Steve Moser
Steve,你能详细说明一下你是如何引用正确的导航控制器的吗? - Benjamin Stark

1
如果你想要一个静态标题,现在(即Xcode 4.6.3)可以通过在相关视图控制器的导航栏中设置标题来完成。
然而,如果你想让导航栏标题根据正在转换到的视图而改变,例如特定表格行的详细信息,则据我所知需要以编程方式设置。
对于我来说,要修改Julian Vogels的正确答案以调用我想使用的键,花了很长时间(新手,叹气!)。以下是有效的方法:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"DetailSegue"]) {
        // Fetch Item
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDictionary *item = [self.groceries objectAtIndex:[indexPath row]];
        // Configure Detail View Controller
        TPDetailViewController *vc = [segue destinationViewController];
        vc.navigationItem.title = [item objectForKey:@"name"];
        [vc setItem:item];   
}

1
这是为了进入另一个UITableView的过渡。
  1. 在目标UITableViewController文件中设置一个公共的NSString属性。

    @property (strong, nonatomic) NSString *navBarTitle;

  2. 在.m文件中覆盖setter以确保其正确性。

    - (void) setNavBarTitle:(NSString *)navBarTitle { _navBarTitle = navBarTitle; }

  3. 在源tableView的segue方法中,传递所需的任何字符串作为标题。

    - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString: @"userDetails"]) { UsersActivitiesTableViewController *destinationController = segue.destinationViewController; //获取用户刚刚单击的单元格的索引路径 NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; //如果下一个视图需要特定的用户名等标题,请从用户数组中获取对象。 UserMO *thisUser = [self.users objectAtIndex:indexPath.row]; //将要用作标题的字符串传递给公共的NSString属性 destinationController.navBarTitle = thisUser.name; } }

  4. 现在是重点...

    在目标控制器中,在视图加载后、显示前,获取视图的顶部控制器并设置标题属性:

    - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController topViewController].title = self.navBarTitle; }


0
如果segue是一个push segue - 如果你正在使用UINavigationController,那么目标视图控制器会自动添加到窗口层次结构中,甚至不需要标识UINavigationController:
if ([segue.identifier isEqualToString:@"yourSegueNameHere"]) {    
    [segue.destinationViewController setTitle:@"yourTitleHere"];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接