我想在我的目标视图控制器上设置标题,以便它在prepareForSegue:方法的导航控制器的导航栏中显示,但是设置它的标题或navigationItem如下:
[segue.destinationViewController setTitle:@"doesn't work"];
[segue.destinationViewController.navigationItem setTitle:@"this either"];
不起作用,因为目标的视图控制器视图尚未加载。我可以在不创建自定义目标视图控制器的情况下执行此操作吗?
答案 0 :(得分:11)
尝试像这样访问ViewController
中嵌入的UINavigationController
。
首先,在界面构建器中为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";
}
}
答案 1 :(得分: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];
}
答案 2 :(得分:1)
这是一个segue到另一个UITableView
在目标UITableViewController文件中设置公共NSString属性。
@property (strong, nonatomic) NSString *navBarTitle;
重写.m文件中的setter只是为了确保。
- (void) setNavBarTitle:(NSString *)navBarTitle
{
_navBarTitle = navBarTitle;
}
在原始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;
}
}
现在重要一点...... 在目标控制器中,获取视图的顶级控制器并在加载视图之后,在显示之前设置title属性:
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController topViewController].title = self.navBarTitle;
}
答案 3 :(得分:0)
如果segue是推送segue - 如果您正在使用UINavigationController它应该是 - 那么目标视图控制器会自动添加到窗口层次结构中,您甚至不需要识别UINavigationController的:
if ([segue.identifier isEqualToString:@"yourSegueNameHere"]) {
[segue.destinationViewController setTitle:@"yourTitleHere"];
}