2011-12-20 10 views
10

Tengo una aplicación con dos segmentos. En uno de los segmentos, el controlador de vista actual se convierte en un delegado y el otro no.prepareForSegue y delegados

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"MoreOptions"]) { 
     UINavigationController *navigationController = segue.destinationViewController; 
     MoreOptionsViewController *controller = (MoreOptionsViewController *)navigationController.topViewController; 
     controller.delegate = self; 
    } else if ([segue.identifier isEqualToString:@"FullStoryView"]) { 
     SingleStoryViewController *detailViewController = segue.destinationViewController; 
     detailViewController.urlObject = sender; 
    } 
} 

Todo esto funciona bien, pero me gustaría tratar de entender mejor el código. Lo que no entiendo es que tengo que obtener una referencia al MoreOptionsViewController tomándolo de navigationController.topViewController en lugar de simplemente obtenerlo de segue.destinationViewController como lo hago en la segunda condición if. ¿Es porque estoy configurando el controlador de vista actual (uno mismo) como el delegado? Una vez más, no estoy tratando de resolver un problema, simplemente tratando de comprender mejor lo que está sucediendo.

Respuesta

11

Eche un vistazo a su guión gráfico y debe ser evidente por qué este es el caso. Ha incrustado MoreOptionsViewController en UINavigationController y ha conectado una transición al controlador de navegación, por lo que es destinationViewController. Esto es bastante común.

+0

Ahh sí, a veces la respuesta está en el sitio, ¿o no? Gracias. –

4

El delegado es en gran medida irrelevante en el contexto de su pregunta.

El primer destino de segue es un controlador de navegación, que contiene el controlador de vista en el que está realmente interesado. Por lo tanto, para acceder a esa vista, debe pasar por el controlador de navegación ya que no tendrá ninguna propiedad están interesados ​​en establecer

Su segunda transición va directamente a un único controlador de vista, por lo que puede acceder directamente.