2011-03-15 10 views
7

Tengo una vista que carga una vista, que necesita enviar una vista al controlador de navegación principal.¿Hay una manera mejor? Delegar -> Delegar -> Delegar

He configurado un delegado para cada vista, y básicamente hago que mi llamada vuelva a ser la "cadena" del controlador de navegación principal.

Funciona, pero tengo curiosidad por saber si hay una manera mejor (¿más fácil?) De lograrlo.

Respuesta

-1

Dependiendo de cómo se haya configurado el programa, si su aplicación Delegado contiene una UINavigationController, podrá acceder al controlador de navegación desde cualquier lugar:

[[[NSApp delegate] navigationController] pushViewController: myVC animated:YES]; 

Pero, de nuevo, que sólo funciona si el delegado de la aplicación contiene una UINavigationController.

+0

UGH. así que arreglé los errores tipográficos. Voy entre Mac OS y la programación de iOS con demasiada frecuencia. –

7

Puede usar el NSNotificationCenter para enviar un mensaje que responderá a su NavigationController.

En su opinión de que hay que llamar a la NavigationController, podría escribir algo como:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DoWork" object:nil]; 

Dónde @"DoWork" es la única (lo más probable) Nombre del mensaje al que se responde otro objeto.

Y en su NavigationController que tendría que añadir un observador para poder coger la notificación, así:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doWork) name:@"DoWork" object:nil]; 

Dónde @selector(doWork) es el selector que desea realizar cuando se publicó la notificación, y @"DoWork" es la notificación a la que quieres responder

+0

¿Hay alguna manera de hacer lo mismo si NO tienes un NavigationController? Intenté agregar NotificiationnCenter a mi primer VC y luego llamar a DoWork desde otro VC, pero se bloqueará la aplicación (selector no reconocido enviado a ...). Entonces, ¿supongo que lo que describes aquí depende de usar un NavigationController? –

+0

@ n.evermind: 'NSNotificationCenter' no se basa en el uso de un controlador de navegación. Quizás debas crear una nueva pregunta de SO para que podamos resolver tu problema. – FreeAsInBeer

2

Por lo tanto, ver A carga la vista B. Más tarde, ver B carga la vista C y quiere empujar su controlador de vista hacia el controlador de navegación aguas arriba de la vista B? ¿visto como? ver el controlador.

Siempre que la vista B tenga un controlador de vista que forma parte de la pila de navegación, su controlador de vista puede tomar el controlador de navegación, sin importar cuán lejos esté la pila, a través de [self navigationController].

Las vistas no tienen un puntero a su controlador, pero si quería romper totalmente MVC, podría hacer que el controlador establezca uno solo. El mejor enfoque sería hacer que el controlador reciba la acción de tocar (o lo que sea que eso suceda cargando y presionando la vista C) y luego hacer que el controlador de vista maneje el intercambio. Por ejemplo, si la vista B es una vista de tabla, establecería su controlador de vista como UITableViewDelegate para que pueda manejar la selección de una fila presionando un nuevo controlador de vista.

Su pregunta parece indicar que no está distinguiendo entre una vista, su controlador de vista, un controlador de navegación y la vista que se muestra en la región de contenido del controlador de navegación. Todos estos objetos desempeñan un papel diferente, por lo que sería rentable que los estudie más de cerca y sus interrelaciones antes de seguir desarrollando su aplicación.

Cuestiones relacionadas