He estado debatiendo con esto por un tiempo, espero que me puedan ayudar.

He sido la creación de una aplicación a través de storyboards en su mayoría, tengo un punto en el que me abre un cuadro de modal para agregar un nuevo registro, emergente funciona bien, el problema es que descartarlo.

He seguido de Apple instrucciones sobre cómo cerrar correctamente modal cajas con los delegados, y que funciona bien, excepto necesito agregar un controlador de navegación para mi modal cuadro, debido a que el complemento de un proceso que requiere de dos pasos (aquí pantalla completa):

Cómo establecer el delegado con un guión gráfico

El problema radica en la configuración de la delegada, así que aquí están mis dos preguntas:

1 – En mi raíz de vista de clase (Mi Ficha) es un delegado del Complemento de la clase (modal), todo bien, excepto este:

- (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 navigationcontroller y no la AddDrinkViewController clase (ver el storyboard). ¿Cómo puedo evitar esto? Si puedo quitar el controlador de navegación por completo, el código funciona bien la configuración de la correspondiente delegado.

2 – hay alguna manera de configurar el delegado arrastrando los puntos de venta en el guión?

Gracias!

  • He estado buscando por todas partes para saber cómo configurar el delegado de un modal. Muchas gracias por ese código. Jaja
InformationsquelleAutor andresmax | 2011-11-07

3 Comentarios

  1. 13

    Tienes razón, la 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 usted puede hacer esto en cualquier parte de su prepareForSegue métodos, y no necesita preocuparse acerca de si existe incluso una 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.

  2. 9

    He encontrado un camino más corto, en mi caso (igual que el tuyo):

    AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0];
    • Bueno! Solucionado mi problema como un encanto!
    • Perfecto, solucionado mi problema así. No podía entender por qué yo podía referencia de las propiedades de otros viewControllers que utilizan el mismo nav controlador pero no de aquellos que use otro. Ufff!
    • De niza. Esto hizo que el truco para mí. Solución inteligente.
  3. 4

    Básicamente, usted necesita para crear un

    Instancia de UINavigationController y asignar destinationViewController a ella

    y agarrar su topView controlador de

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"showAdd"]) {
    
        UINavigationController *navigationController = segue.destinationViewController;
        AddDrinkViewController *addDrinkcontroller = (AddDrinkViewController *)navigationController.topViewController;
    
        addDrinkcontroller.delegate = self;
    
       }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here