2009-10-19 6 views
13

Solo por curiosidad, ¿cómo sabe la implementación del método nextResponder de la clase UIView saber quién es el UIViewController que gestiona la vista? La documentación de UIResponder indica esto, y puedo ver que funciona, pero no lo entiendo del todo. Que yo sepa, una UIView no mantiene una referencia a su controlador, entonces, ¿qué está sucediendo detrás de escena? ¿O solo me estoy perdiendo algo obvio?¿Cómo sabe UIView nextResponder qué es UIViewController?

Todavía soy muy nuevo en el desarrollo de Objective-C y iPhone, así que me disculpo si esto es algo obvio, pero estoy bastante curioso.

Gracias!

Respuesta

7

El responder chain está separado de la jerarquía de vista. La cadena de respuesta podría tener este aspecto:

First Responder > View Hierarchy > Window > Window Delegate > etc... 

Sin embargo, los objetos pueden insertarse en la cadena de respuesta y eso es lo que hace UIViewController. De los documentos:

Dado que los controladores de vista están estrechamente vinculados a las vistas que administran, también son parte de la cadena de respuesta utilizada para manejar eventos. Los controladores de vista son descendientes de la clase UIResponder y se insertan en la cadena de respuesta entre la vista administrada y su supervista.

En Big Cocoa, esto se logra utilizando el método -setNextResponder :. Ese método no es público en Cocoa Touch, pero sin embargo, eso es lo que parece hacer UIViewController.

0

Supongo que el sistema puede mantener una asignación entre los objetos UIViewController y sus objetos raíz UIView. El código para el cruce de la cadena de respuesta puede usar esta asignación para pasar el evento al objeto UIViewController correspondiente.

Típicamente se añaden subvistas usando:

subvista = [vista viewController]

[supervista addSubview subvista]

método addSubview establece automáticamente supervista como el próximo respondedor para subvista, así que:

a) viewController no tendrá la oportunidad de insertarse entre superview y subview.

b) viewController no sabe sobre superview, por lo tanto no puede establecerlo como su próximo respondedor.

c) Apple recomienda que una vista no se comparta entre los controladores. En ausencia de multithreading, esta restricción solo tiene sentido si hay un mapa de vistas y controladores de vista.

2

Si mira UIView.h, puede ver una variable miembro llamada _viewDelegate que es del tipo UIViewController *, es probable que esta sea la ubicación donde se almacena la referencia del controlador de vista cuando se establece la propiedad viewcontroller's view, y donde sabe mira cuando llamas a nextResponder.

1

En realidad, hay una aplicación privada en la que se puede obtener el controlador de visualización al que pertenece. Muy útil;) Supongo que cuando se agrega una vista a un controlador de vista (controller.view) esta propiedad está configurada.

Cuestiones relacionadas