2012-04-23 17 views
6

UIControl - changing assigned selectors: addTarget & removeTarget¿Debo removeTarget antes addTarget

Unidos que se debe quitar el destino antes de cambiar a otro. Sin embargo, ¿qué ocurre si configuro el objetivo en cellForRowAtIndexPath? ¿Debo eliminar el objetivo antes de agregarlo nuevamente aunque no cambie? ¿Llamará al método dos veces si no lo elimino o simplemente lo sobreescribirá?

[cell.cellSwitch removeTarget:self action:@selector(notifySwitchChanged:) forControlEvents:UIControlEventValueChanged]; 
[cell.cellSwitch addTarget:self action:@selector(notifySwitchChanged:) forControlEvents:UIControlEventValueChanged]; 

Respuesta

0

Siguiendo mi experiencia, se llamará solo una vez.

Pero IMO, es mejor usarremoveTarget siempre porque el código se puede cambiar en el futuro. Y es posible que algún día necesite agregar múltiples objetivos y selectores.

Sea un código seguro, escalable y fácil de mantener.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = // code with reuse identifier ... 
    if(cell == nil) 
    { 
     // making view for cell .... 
    } 

    // myAction will be called ONLY ONCE after many times of scrolling 
    [cell.myButton addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside]; 

    return cell; 
} 
0

En lugar de añadir/eliminar objetivos, me he dado cuenta que si ya estoy subclasificación de la UITableViewCell, voy a añadir un nuevo delegado y establecer el delegado en el controlador de vista. De esta forma, cualquier método invocado al delegado puede pasar en la celda completa y, por lo tanto, puedo obtener la ruta de índice de la celda llamando al método UITableViewindexPathForCell.

Cuestiones relacionadas