2013-07-22 4 views
8

Voglio semplicemente impostare il titolo sul mio controller di visualizzazione di destinazione in modo che venga visualizzato nella barra di navigazione del controller di navigazione in prepareForSegue: metodo tuttavia impostandone il titolo o il parametro navigationItem in questo modo:Come impostare il titolo sul controller della vista di destinazione durante prepareForSegue:

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

non funziona probabilmente perché vista del controllore vista della destinazione non è ancora stato caricato. Posso farlo senza creare un controller di visualizzazione di destinazione personalizzato?

risposta

11

Prova ad accedere al tuo ViewController che è incorporato nel UINavigationController come questo. Prima di dare un identificativo ai passaggi nel builder dell'interfaccia, quindi accedi al seguito nel metodo prepareForSegue e imposta il titolo accedendo alla proprietà topViewController del controller di navigazione a cui tieni seguito.

- (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 = @"Your title"; 

    } 
} 
+2

Grazie.Questo non era esattamente il mio problema, né questa soluzione funziona per me, ma mi ha ricordato che il controller della vista sorgente si trova in una vista contenitore che si trova all'interno di un controller della visualizzazione di navigazione. Quindi ho dovuto fare riferimento al controller di navigazione corretto nella mia pila di viste. –

+0

Steve, puoi approfondire come hai fatto riferimento al controller di navigazione corretto? –

1

Se volete un titolo statico questo può ora (vale a dire, in Xcode 4.6.3) questo può essere fatto in Storyboard semplicemente impostando il documento nella barra di navigazione sul controller della vista in questione.

Se tuttavia si desidera che il titolo della barra di navigazione cambi in base a quale visualizzazione viene seguita, ad esempio, un dettaglio di una particolare riga di tabella, per quanto ne so che deve essere impostato a livello di codice.

Mi ci è voluto SEMPRE (principiante, sospiro!) Per capire come modificare la risposta corretta di Julian Vogels per chiamare la chiave che volevo usare. Ecco che cosa ha funzionato:

- (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

Questo è per un segue in un altro UITableView

  1. Impostare una proprietà pubblica NSString nel file di destinazione UITableViewController.

    @property (strong, nonatomic) NSString *navBarTitle;

  2. Override il setter nel file .m solo per essere sicuri.

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

  3. Nel originario metodo segue di tableView, passare qualunque stringa è necessario nel titolo.

    - (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. E ora per il bit importante .... Nel controllore di destinazione, ottenere il controllore superiore della vista e impostare la proprietà del titolo, dopo la vista è caricato, e prima che sia stata consultabili:

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

0

Se la segue è una spinta segue - che dovrebbe essere se si sta utilizzando un UINavigationController - allora il controller della vista di destinazione è automaticamente aggiunto alla gerarchia della finestra e non è nemmeno necessario identificare UINavigationController:

if ([segue.identifier isEqualToString:@"yourSegueNameHere"]) {  
    [segue.destinationViewController setTitle:@"yourTitleHere"]; 
} 
Problemi correlati