2009-11-24 12 views
5

Hola, estoy buscando recursos útiles sobre Delegados. Entiendo que el delegado se sienta en segundo plano y recibe mensajes cuando ocurren ciertas cosas, p. se selecciona una celda de tabla o se recuperan los datos de una conexión a través de la web.Delegados, no entiendo bien

Lo que me gustaría saber en particular es cómo usar delegados con múltiples objetos. Hasta donde yo sé, especificar el mismo delegado para un objeto (por ejemplo, celda de tabla) provocaría que se convocaran los mismos eventos para ambas celdas al mismo tiempo. ¿Hay algo equivalente a crear instancias de un delegado para un objeto en particular?

¡Gracias de antemano!

Respuesta

6

en el cacao, los objetos casi siempre identificarse cuando se llama a un método delegado. Por ejemplo, UITableView hace pasar como primer parámetro del mensaje delegado al llamarlo:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

Si quería el mismo delegado de manejar múltiples UITableViews, a continuación, sólo se necesita un poco de condicional en el objeto tableView pasado a la método:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (tableView == self.myFirstTableView) { 
     // do stuff 
    } else if (tableView == self.mySecondtableView) { 
     // do other stuff 
    } 
} 

}

Si no desea comparar los punteros de objeto directamente, siempre se puede utilizar la propiedad tag para identificar sus puntos de vista.

2

Normalmente, si tiene un método de delegado que podría tener que recibir mensajes de muchos objetos diferentes, simplemente tiene que pasar el objeto de llamada al delegado en el mensaje (llamada de método).

Por ejemplo, si usted quiere un método delegado para extraer el texto de la etiqueta de un tableviewcell, la definición del método sería algo como:

-(void) extractTextFromLabelOfTableCell:(UITableViewCell *) theCallingCell{ 
... 
NSString *extractedText=theCallingCell.textLabel.text; 
} 

Se podría llamar al método de un tableviewcell así:

[delegate extractTextFromLabelOfTableCell:self]; 

Cada instancia de tableviewcell se enviaba al delegado y el delegado extraía el texto de esa instancia. De esta forma, un solo objeto delegado podría manejar una cantidad arbitrariamente grande de celdas.

1

Un delegado es una forma de agregar comportamientos a una clase sin crear subclases o asociar un controlador a una clase.

En el ejemplo de la vista de tabla que dio, el delegado extiende o controla la tabla, no la celda. La tabla está diseñada para tener un controlador, la celda no. Esta elección de diseño es la razón por la que no puede especificar delegados específicos de celda.

Sin embargo, los métodos delegados siempre anunciarán el objeto fuente (aquel al que está conectado el delegado) y los parámetros relevantes (como la celda involucrada) por lo que siempre se debe poder manejar la acción por completo.

En su caso, si tiene una celda y desea que la célula se administre a sí misma, el método de delegado (que probablemente se implementará en su UITableViewController) simplemente puede recuperar la celda desde la tabla fuente usando NSIndexPath (pasó como un parámetro para el método de delegado) e invocar un método en la subclase de celda para hacer su trabajo.