2012-04-11 8 views
10

¿Cuál es la forma correcta de conectar y quitar un UIGestureRecognizer en una vista?Forma correcta de colocar/quitar UIGestureRecognizers

Normalmente creo y adjunto UIGestureReconizers en -viewDidLoad. ¿Debo usar removeGestureRecognizer en el -viewDidUnload? ¿O son eliminados automáticamente?

Por ejemplo, ¿es una mejor manera de crear una propiedad UIGestureRecognizer e inicializarla en el método init de viewController y luego adjuntar/eliminar esta propiedad gestureRecognizer en -viewDidAppear/-viewDidDisappear?

(Tenga en cuenta que estoy usando ARC)

Gracias.

+0

Ya lo he revisado, pero no encontré la respuesta a mi pregunta. – mrd3650

+0

@TheLion: "Lo siento, esa página no se puede encontrar". – Colas

+0

Sorry apple lo ha cambiado así que [aquí] (https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html) es la nueva URL para el mismo recurso. Gracias por señalar @Colas –

Respuesta

10

Esencialmente puede crear, agregar y eliminar reconocedores de gestos cuando tenga sentido. Y "cuando tiene sentido" varía dependiendo de algunas cosas, pero generalmente solo depende de si las mantendrás como ivars. Con ARC, la clave es gestionar referencias sólidas; Con ARC, los ivars son fuertes por defecto.

Digamos que agrega un reconocedor de tap. En este escenario, no es necesario volver a acceder al reconocedor. Lo crearía así:

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
    [self.view addGestureRecognizer:tap]; 
} 

Con este escenario, no necesita hacer nada más para administrar este reconocedor. El sistema de vista contiene una fuerte referencia a él. Todo lo que haces es sentarte y esperar que llame al handleTap:. Cuando la vista se descargue, este reconocedor de tap será desasignado.

Este escenario tampoco sería bueno para agregar este reconocedor en viewWillAppear: ya que no es difícil imaginar una serie de eventos que darían lugar a la creación de múltiples reconocedores.

Por lo tanto, lógicamente, si desea agregar un reconocedor en los métodos de apariencia, deberá mantener algún tipo de referencia en un ivar. Pero, nuevamente, eso no siempre es una mala idea. En general, la razón por la que desea consultar sus reconocedores es ayudar en la lógica de los métodos <UIGestureRecognizerDelegate>, si se utilizan.

Personalmente, nunca agregaría un reconocedor en el método initWith.. para adjuntarlo más tarde. La única ventaja es que cualquier reconocedor que cree allí se mantendrá durante toda la vida del controlador de vista. Pero dado que un reconocedor es claramente parte del sistema de visualización, este tipo de problema se complica con el MVC en el que Cocoa es grande. También en condiciones de poca memoria, la vista de los controladores en la pila de navegación se purga, pero en este caso el reconocedor puede permanecer usando la memoria (no hay grandes objetos) sin una razón real.

Sin duda podría agregar un reconocedor en un método view(Will/Did)Appear: y eliminarlo en view(Will/Did)Disappear:. No es mi preferenciaNo creo que solo porque se presente y elimine una vista modal o haya ocurrido una navegación push/pop que deba eliminar y volver a agregar mis reconocedores.

Yo recomendaría casi siempre usar viewDidLoad para crear instancias y conectar sus reconocedores. Simplemente recuerde que no hay referencias fuertes en el viewDidUnload para ayudar en una situación de poca memoria. Y de nuevo con ARC no hay necesidad de hacer nada con ivars en dealloc.

+0

¡Gracias NJones por la respuesta detallada! La razón para adjuntar/separar Reconocedores en Ver (lo hizo/lo hizo) Cargar y Descargar fue puramente por razones de memoria (por lo que cuando la vista no está en la pantalla, la memoria se libera y se asigna cuando está en la pantalla) pero por lo que dice , no hace mucha diferencia. – mrd3650

0

viewDidUnload se llama solo en condiciones de poca memoria y no se garantiza que se invoque en absoluto. Por lo tanto, cualquier reconocedor de gestos eliminado en viewDidUnload también debe eliminarse en dealloc. Cualquier otro método que menciones está bien.

0

bien, entonces viewWillAppear:Animated y serán la mejor opción para hacer cualquier cosa con gestos a mi entender.

Cuestiones relacionadas