2012-07-10 20 views
7

tengo una aplicación, en el que tengo una UITableView dentro de un UIView, que es otra vez dentro de un UIScrollView, por lo que la jerarquía se convierte de esta manera:¿Por qué UITableView llama a los métodos delegados de UIScrollView?

UIScrollView ->UIView ->UITableView

Los datos dentro de mi UITableView se llena correctamente.

Ahora, mi problema es que, cuando me desplazo mi UITableView, el método UIScrollView's delegado scrollViewDidEndDecelerating: y scrollViewDidEndDragging:: es llamado.

No deseo este comportamiento, ¿qué debo hacer para detener este comportamiento?

Cualquiera por favor Ayuda, Gracias de antemano !!!

+0

Si le entiendo correctamente, tiene 2 vistas de desplazamiento, ya que UITable ya se encuentra en una vista de desplazamiento. Esto podría estar causando el problema. – geminiCoder

+0

No, he mantenido [parentScroll setScrollEnabled: NO] ... Así que ese no es el problema ... –

+0

OK En ese caso veo por qué esto sería confuso, déjame pensar – geminiCoder

Respuesta

8

UITableViewDelegate extiende UIScrollViewDelegate. De ahí la convocatoria de los métodos delegados.

Para detener esta puede establecer tableView.tag = 1000; cuando alloc la tableView y en los métodos UIScrollViewDelegate (scrollViewDidEndDecelerating: and scrollViewDidEndDragging::) Incluir este en el mismo principio:

if(scrollView.tag == 1000) 
    return; 
+1

... o mantenga un puntero a la vista de tabla como un ivar y compare con eso. –

+0

cierto. Uso etiquetas para minimizar el uso de punteros. No es que les tenga miedo, pero IMO haciendo uso de autorrelease y etiquetas hace que el código sea menos vulnerable a fugas de memoria. – George

+0

Uso el puntero debido a un miedo irracional de que las etiquetas no sean únicas. Tonto en este caso, lo sé ... –

3

Debido UITableView hereda de UIScrollView. Entonces muestra todas las propiedades y comportamientos de UIScrollView. Si no quieres esto, por favor haz una cosa.

Suponiendo que tiene otra vista de desplazamiento en su página.

en el viewDidLoad o desde el XIB (si tiene su vista de tabla en el XIB), establezca una etiqueta para su tabla vista.

en el código,

self.objYourTableView.tag = 101; 

continuación, en la vista de desplazamiento delegado

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
    { 
     if(!(scrollView.tag == 101)) 
     { 
      // Go for your code to run. 
     } 
    } 

para que el código se saltará si se llama por la vista de tabla. Otros casos funciona perfecto. Espero que esto te ayudará.

+1

'Porque UITableView hereda de UIScrollView'. No. Es porque 'Debido a que UITableViewDelegate hereda de UIScrollViewDelegate'. – George

Cuestiones relacionadas