8

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

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

可能不起作用,因为目标的视图控制器的视图尚未加载。我可以在不创建自定义目标视图控制器的情况下执行此操作吗?

4

4 回答 4

11

尝试访问您ViewController嵌入的UINavigationController类似这样的内容。首先,您在界面构建器中为您的 segue 提供一个标识符,然后您在方法中访问 segue并通过访问您 segue 的导航控制器prepareForSegue的属性来设置标题。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";
    }
}
于 2013-07-22T16:18:42.030 回答
1

如果你想要一个静态标题,现在可以(即在 Xcode 4.6.3 中)这可以在 Storyboard 中完成,只需在相关视图控制器的导航栏中设置标题即可。

但是,如果您希望导航栏标题根据被连接到的视图进行更改,例如,特定表格行的详细信息,据我所知,需要以编程方式设置。

我花了永远(新手,叹息!)弄清楚如何修改 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];   
}
于 2014-05-12T22:23:41.283 回答
1

这是为了进入另一个 UITableView

  1. 在目标 UITableViewController 文件中设置公共 NSString 属性。

    @property (strong, nonatomic) NSString *navBarTitle;

  2. 为确保安全,覆盖 .m 文件中的设置器。

    - (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; //Get the index path of the cell the user just clicked NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; //Grab the object from the array of users if the next view requires a specific title for a user name etc. UserMO *thisUser = [self.users objectAtIndex:indexPath.row]; //Pass the string you want as the title to the public NSString property destinationController.navBarTitle = thisUser.name; } }

  4. 现在是重要的一点......在目标控制器中,获取视图的顶部控制器并设置标题属性,在加载视图之后,在它显示之前:

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

于 2015-12-09T18:33:07.503 回答
0

如果 segue 是 push segue - 如果您使用 UINavigationController 应该是这样 - 然后目标视图控制器会自动添加到窗口层次结构中,您甚至不需要识别 UINavigationController:

if ([segue.identifier isEqualToString:@"yourSegueNameHere"]) {    
    [segue.destinationViewController setTitle:@"yourTitleHere"];
}
于 2016-03-14T18:14:13.260 回答