guión guion gráfico ejemplos objective-c ios storyboard

objective c - guion - Cómo configurar el delegado con un guión gráfico



ejemplos de guión gráfico storyboard (3)

Encontré un camino más corto en mi caso (igual que el tuyo):

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

He estado debatiendo sobre esto por un tiempo, espero que puedan ayudarme.

He estado creando una aplicación usando storyboards en su mayoría, tengo un punto donde hago aparecer un cuadro modal para agregar un nuevo registro, el popup funciona bien, el problema es descartarlo.

He seguido las instrucciones de Apple sobre cómo cerrar correctamente los cuadros modales usando delegados, y eso funciona bien, excepto que necesito agregar un controlador de navegación a mi cuadro modal, porque el proceso de agregar requiere dos pasos (aquí a pantalla completa ):

El problema radica en configurar el delegado, así que aquí están mis dos preguntas:

1- En mi clase de vista raíz (Mi pestaña) es un delegado de la clase Agregar (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] devuelve el controlador de navegación y no la clase AddDrinkViewController (consulte el guión gráfico). ¿Cómo puedo evitar esto? Si elimino por completo el controlador de navegación, el código funciona correctamente configurando el delegado apropiado.

2- ¿Hay alguna forma de configurar al delegado arrastrando los puntos de venta en el guión gráfico?

¡Gracias!


Básicamente, necesitas crear un
Instancia de UINavigationController y asignarle destinationViewController
y agarrar su controlador 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; } }


Tiene 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

Ahora puede hacer esto en cualquiera de sus métodos prepareForSegue , y no tener que preocuparse de 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 configurar el delegado dentro de IB.