2011-11-07 14 views
19

Ho discusso con questo per un po 'ora, spero che tu possa aiutarmi.Come impostare il delegato con uno storyboard

Ho creato un'app utilizzando gli storyboard per lo più, ho un punto in cui faccio apparire una casella modale per aggiungere un nuovo record, il popup funziona bene, il problema è scartarlo.

Ho seguito le istruzioni di Apple su come correttamente stretti scatole modali utilizzando i delegati, e che funziona bene, tranne che ho bisogno di aggiungere un controller di navigazione al mio dialogo modale, in quanto il processo di aggiunta richiede due passaggi (qui fullscreen):

enter image description here

il problema sta nel fissare il delegato, ecco le mie due domande:

1- a mio avviso radice di classe (My Tab) è un delegato della classe Add (modale) , tutto è impostato correttamente tranne questo:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 
     [[segue destinationViewController] setDelegate:self]; 

    } 
} 

Il problema sta nel fatto che [destinationViewController segue] viene restituita l'navigationController e non la classe AddDrinkViewController (vedi lo storyboard). Come faccio a evitare questo? Se rimuovo del tutto il controller di navigazione, il codice funziona correttamente impostando il delegato appropriato.

2- C'è un modo per impostare il delegato trascinando le prese nello storyboard?

Grazie!

+0

Ho cercato dappertutto come impostare il delegato di un modal. Grazie mille per quel codice. Haha – MattAitchison

risposta

13

Hai ragione, il destinationViewController sarà un UINavigationController in questo caso. Ho scritto una categoria per gestire questa situazione comune:

// category .h file 
@interface UIStoryboardSegue (NavControllerExtensions) 
// Gets destinationViewCotroller. But if that controller 
// is a NavigationController, returns the nav controller's 
// top level view controller instead. 
@property (readonly) id topLevelDestinationViewController; 
@end 

// category .m file 
@implementation UIStoryboardSegue (NavControllerExtensions) 
- (id)topLevelDestinationViewController 
{ 
    id dest = self.destinationViewController; 
    if ([dest isKindOfClass:[UINavigationController class]]) { 
    UINavigationController* nav = dest; 
    dest = nav.topViewController; 
    } 
    return dest; 
} 
@end 

Così ora si può solo fare questo in uno dei tuoi prepareForSegue metodi, e non c'è bisogno di preoccuparsi se esiste anche un NavigationController:

[[segue topLevelDestinationViewController] setDelegate:self] 
// another example: 
MyViewController *vc = segue.topLevelDestinationViewController; 
vc.delegate = self; // etc. 

Per rispondere alla seconda domanda, non sono riuscito a trovare un modo per impostare il delegato in IB.

9

ho trovato un modo più breve nel mio caso (uguali ai suoi):

AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0]; 
+1

Bello! Risolto il mio problema come un incantesimo! – iDroid

+0

Perfetto, ho risolto anche il mio problema. Non ho potuto capire perché potrei fare riferimento alle proprietà di altri viewControllers che usano lo stesso controller nav ma non quelli che ne usano un altro. Accidenti! –

+0

Bello. Questo ha fatto il trucco per me. Soluzione intelligente –

4

Fondamentalmente è necessario creare un
grado delle UINavigationController e assegnare destinationViewController ad esso
e afferrare il suo controllore Topview

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 

    UINavigationController *navigationController = segue.destinationViewController; 
    AddDrinkViewController *addDrinkcontroller = (AddDrinkViewController *)navigationController.topViewController; 

    addDrinkcontroller.delegate = self; 

    } 
} 
Problemi correlati