UITableViewDelegate y UITableViewDatasource confusion

Entendi antes de eso
Delegate patrón de Delegate se usa solo para invocar events para delegate instance y get controles (como tamaño / fuente / etc …).

Datasource patrón de Datasource es solo para get datos de la datasource instance de datasource instance (como vistas / título / descripción / etc …)

Pero parece que fue una buena ilusión, después de search el UITableViewDelegate protocol de Apple, me confundí porque

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; 

Son methods delegates (pero yo estaba pensando que son methods UITableViewDatasource )

¿Es este un código sucio de Apple, o me estoy perdiendo algo importante también entiendo la diferencia entre el origen de datos y el delegado?

EDIT: Gracias @DBD por una buena respuesta, aquí hay más confusión

Aquí está el método UITableViewDelegate que devuelve la vista para el dibujo

 - (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: sección (NSInteger);

Y también hay una configuration en UITableViewDataSource

 - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: sección (NSInteger);

Y vaya, podemos ver un método que devuelve una vista en UITableViewDataSource

 - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath;

Aquí tenemos una pregunta por qué cellForRowAtIndexPath: y viewForHeaderInSection: no están en UITableViewDataSource

Así es como siempre lo he pensado.

UITableViewDataSource para ser datos primarios. ¿Cuáles son los contenidos reales de la tabla? Cuantas filas ¿Cuál es el contenido de la fila X?

UITableViewDelegate fue secundario y muestra datos. Qué tan alto debería ser, debería mostrarse en el estado seleccionado y devolver la llamada para "hey, estoy a punto de hacer algo".

Sin embargo, admito que veo algo como una línea fina (y no compro algunas de las opciones)

UITableViewDataSource tiene UITableViewDataSource . UITableViewDelegate tiene viewForHeaderInSection .

Entonces, si es un título puro de "datos", es la fuente de datos, pero si incluye un contenedor de visualización con una vista, es el delegado. Pero espera, cellForRowAtIndexPath es una vista y eso es parte de la fuente de datos, entonces ¿por qué pondrías viewForHeaderInSection en el delegado? Si bien apenas puedo ver la distinción entre "cell" como datos y "title view" como delegado, creo que la confusión de dividir los methods de "título" en diferentes protocolos no es preferible. Estoy seguro de que muchos podrían estar en desacuerdo conmigo, pero es solo mi opinión.

Creo que la distinción crítica aquí surge de lo que usted considera "datos". A partir de su pregunta, creo que entiende "datos" para significar "cualquier valor de retorno", es decir, los methods que devuelven void son methods delegates y los methods que devuelven void son methods de origen de datos (ya que devuelven algo al envío vista de tabla).

Esto a veces puede ser una aproximación útil, pero aquí no es correcto. Los datos de una vista de tabla son los contenidos que muestra: el contenido de las celdas, los títulos de las secciones, etc. Cualquier otra información, incluida la del layout (como la altura de la fila) o la pantalla (como los encabezados de sección), pertenece adecuadamente al delegado, ya que no se trata de los contenidos de la tabla, sino simplemente de cómo mostrar esos contenidos.

Los dos están muy a menudo relacionados, por lo que la mayoría de las veces la misma subclass UITableViewController implementa tanto el delegado como la fuente de datos, pero imagina: podrías hacer que un object actúe como el origen de datos y las células vend, luego tener un object diferente actuar como delegue y proporcione alturas para sus filas basadas en criterios completamente diferentes. (Imagine una tabla en la que el usuario puede cambiar el tamaño de las filas, por ejemplo. Aún proporciona los contenidos de cada fila, pero la altura (la responsabilidad del delegado) proviene de un set de información muy diferente).

dataSource y delegate son ambos protocolos, pero están separados en dos términos para que podamos entender mejor qué están diseñados para hacer los methods.

Esto significa:

  1. El protocolo dataSource define una API que suministra los datos donde el delegate suministra el comportamiento.
  2. dataSource está en la capa del model y el delegado está en la capa de control.

Creo que esta es la perspectiva correcta.

Tengo la misma confusión contigo, hasta que veo el documento de Apple.

El protocolo UITableViewDataSource es adoptado por un object que media el model de datos de la aplicación para un object UITableView. La fuente de datos proporciona el object de vista de tabla con la información que necesita para build y modificar una vista de tabla.

Como representante del model de datos, la fuente de datos proporciona información mínima sobre el aspecto de la vista de tabla . El delegado del object de vista de tabla, un object que adopta el protocolo UITableViewDelegate, proporciona esa información.

Referencia del protocolo UITableViewDataSource

No entiendo tu punto.

Los methods de protocolo de origen de datos están todos relacionados con los datos. El protocolo de delegado en su lugar tiene methods relacionados con la apariencia de las células.