Cómo configurar el delegado con un storyboard

He estado debatiendo con esto por un time ahora, espero que puedas ayudarme.

He estado creando una aplicación que utiliza principalmente storyboards, tengo un punto en el que aparece un cuadro modal para agregar un nuevo logging, el popup funciona bien, el problema lo está descartando.

He seguido las instrucciones de Apple sobre cómo cerrar correctamente los cuadros modales utilizando delegates, y eso funciona bien, excepto que necesito agregar un controller de navigation a mi cuadro modal, porque el process de agregar requiere dos pasos (aquí a pantalla completa ):

introduzca la descripción de la imagen aquí

El problema radica en establecer al delegado, así que estas son mis dos preguntas:

1- En mi class de vista raíz (My Tab) es un delegado de Add class (el modal), todo está configurado correctamente, excepto esto:

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

El problema radica en que [segue destinationViewController] está devolviendo el control de navigation y no la class AddDrinkViewController (ver el guión gráfico). ¿Cómo obtengo esto? Si elimino por completo el controller de navigation, el código funciona bien configurando el delegado adecuado.

2- ¿Hay alguna manera de configurar el delegado arrastrando las salidas en el guión gráfico?

¡Gracias!

Tienes razón, el destinationViewController será un UINavigationController en este caso. Escribí una categoría para manejar esta situación común:

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

Así que ahora puede hacer esto en cualquiera de sus methods prepareForSegue , y no necesita preocuparse por si existe un NavigationController :

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

Para responder a su segunda pregunta, no pude encontrar una manera de establecer el delegado dentro de IB.

Encontré una forma más corta en mi caso (igual que la tuya):

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

Básicamente necesitas crear una
Instancia de UINavigationController y asigna destinationViewController a él
y agarra su controller 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; } }