¿Por qué UIViewController es una subclass de UIResponder?

¿Cuál es el propósito para hacer UIViewController una subclass de UIResponder ? ¿Se hizo únicamente para pasar los events de rotation?

No pude encontrar ninguna información definitiva sobre eso en los documentos.

Actualizar

Entiendo que si algo se hace un UIResponder , este algo se supone que debe includese en la cadena de respuesta y los events de process. Pero tengo dos dudas.

  1. Hasta donde yo sé, UIViewController se coloca en la cadena de respuesta justo después de su view . ¿Por qué necesitamos un controller de vista en la cadena de respuesta? Su view ya está ahí, entonces, ¿por qué no dejamos que la vista procese los events que no fueron manejados por sus subvistas?
  2. Bien, estoy listo para aceptar que podríamos necesitar esto. Pero me gustaría ver algunos ejemplos de la vida real, cuando realmente se necesita procesar los events en un controller de vista y es la manera mejor / más fácil / más apropiada de hacer algo.

Creo que su problema puede ser simplemente el fracaso del pensamiento orientado a objects.

Por los documentos:

La cadena de respuesta es una serie vinculada de objects de respuesta a los que se aplica un evento o un post de acción.

En UIKit, el controller de vista se encuentra en la cadena de respuesta entre su vista y la vista a la que se empujó el controller. Por lo tanto, se ofrece cualquier evento o acción que sus vistas no manejen.

La siguiente respuesta del controller de vista superior es la window, la respuesta siguiente de la window es la aplicación, la respuesta siguiente de la aplicación es el delegado de la aplicación y el delegado de la aplicación es donde se detiene la inversión.

Su pregunta "¿Se hizo únicamente para pasar los events de rotation?" aplica la testing incorrecta; implica que, en algún momento, la cadena de respuesta había sido diseñada de otra forma y alguien pensó: 'oh, espera, ¿qué pasa con la rotation? Mejor tirar los controlleres de vista a la cadena '.

La pregunta original habrá sido: ¿es útil si el controller de vista puede manejar events o acciones si ninguno de los puntos de vista los maneja? La respuesta obviamente debería ser "sí" ya que, incluso en un dispositivo de pantalla táctil, habrá events o acciones que no están inherentemente relacionados con una vista.

Los ejemplos más obvios son los relacionados con inputs físicas distintas de la pantalla. Entonces, la rotation del dispositivo es uno. Las teclas presionadas en un keyboard bluetooth son otra. Los controles remotos son un tercero. El acelerómetro es el cuarto.

El siguiente ejemplo más obvio es cualquier evento o acción generada por el sistema que debería ir al actor único más local y no a todos. En iOS, generalmente son requestes de un actor más específico, como el administrador de deshacer más local o la identidad de la vista de input para mostrar si el enfoque se acerca a usted.

Un ejemplo un poco less obvio es el ejemplificado por UIMenuController , una vista emergente que publica un evento de input de usuario que puede necesitar recorrer varios controlleres de vista para llegar al que debería actuar en él. Los controlleres de vista infantil de iOS 5 aumentan enormemente el número de posibilidades aquí; muchas veces vas a tener un controller de vista principal con la lógica para hacer un montón de cosas y los niños que quieren pasar posts a quienquiera que sepa cómo manejarlos, sin codificar la jerarquía.

Entonces, no, los controlleres de vista no se agregaron a la cadena de respuesta solo para manejar los events de rotation. Se agregaron porque, lógicamente, pertenecen a la base de la definición inicial de la cadena de respuesta.

Esto va a sonar como una respuesta simple, pero en realidad no lo es. UIViewController es una subclass de UIResponder para que pueda responder a las acciones del usuario (por ejemplo, toques, movimiento, etc.).

Si una vista no responde a un evento, se pasa a la cadena de respuesta y los objects de nivel superior tienen la oportunidad de manejarlo. Por lo tanto, los controlleres de vista y la class de aplicación son todas subclasss de UIResponder

Puede encontrar información más detallada sobre la cadena de respuesta en Competencias de aplicaciones de Cocoa para iOS: Objeto Responder en el sitio de desarrolladores de Apple.

UIViewController está en la cadena de respuesta para permitir que procese cualquier evento. Hay más que solo los events en los que piensas (toques) que pasan por esta cadena. Los events de movimiento pasan por la cadena, tocan events que una vista específica no maneja, también puede forzar cosas a través de la cadena de respuesta usando [UIApplication sendEvent:...] con un objective nulo.

La otra cosa que puede notar es UIApplication es también una subclass de UIResponder. Todos los events que no se manejan terminarán allí.

En la concepción MVC, el event handlingl evento ocurrido a la vista debe realizar el controller.

Hay una function, para establecer el parámetro "nulo" a "objective" de – [UIControl addTarget: action: forControlEvents:] en caso de que se busque en la cadena de respuesta un object dispuesto a responder a la acción.

Es decir, debido a la opción de búsqueda, UIViewController es la subclass de UIResponder.

Por lo tanto, puede enviar sus events de control personalizados de la misma manera para get los beneficios de la opción de "búsqueda".