2011-10-13 11 views
22

Tengo una UITableView con varias secciones. Cada sección tiene un encabezado de sección (una vista personalizada) ¿hay alguna manera fácil de detectar cuándo alguien selecciona el encabezado de la sección? (Al igual que didSelectRowAtIndexPath, pero para el encabezado?)uitableviewcontroller seleccione encabezado para la sección

Gracias de antemano.

Respuesta

24

No, no hay forma de hacerlo con el UITableViewDelegate.

Lo que puede hacer es agregar un botón del tamaño de la vista del encabezado de la sección y agregarlo a la vista. Establezca la etiqueta del botón en el índice de la sección. Luego solo agregue el UIViewController como destino para el UIControlEventTouchUpInside.

Luego, al mirar la etiqueta del botón, puede ver en qué sección se hace clic.

+0

o simplemente puede devolver una UUtilizar el tamaño del encabezado en el método "viewForHeaderInSection", en lugar de agregarlo y devolverlo –

60

Esto no es radicalmente diferente a la respuesta de @rckoenes, pero proporciona una forma más ortodoxa de manejar eventos en vistas en lugar de usar botones invisibles.

prefiero añadir un UITapGestureRecognizer a mi vista de encabezado en lugar de añadir botones invisibles y les cambio de tamaño:

UITapGestureRecognizer *singleTapRecogniser = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease]; 
[singleTapRecogniser setDelegate:self]; 
singleTapRecogniser.numberOfTouchesRequired = 1; 
singleTapRecogniser.numberOfTapsRequired = 1; 
[yourHeaderView addGestureRecognizer:singleTapRecogniser]; 

y luego:

- (void) handleGesture:(UIGestureRecognizer *)gestureRecognizer; 

Se puede utilizar para ver qué gesture.view fue tocado Luego hacer lo que tiene que hacer para averiguar cuál de cabecera era (etiquetas, los datos matriz de búsqueda ...)

+0

Creo que debe cambiar el método a: '- (void) gestureHandler: (UIGestureRecognizer *) gestureRecognizer;' porque define la acción como 'gestureHandler' – fsulser

+0

use YourView * tappedView = (YourView *) gestureRecognizer.view; para ver qué punto de vista fue más explícito –

4

Aquí es lo que funcionó para mí en Swift 2:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

    let v = UITableViewHeaderFooterView() 
    v.textLabel?.text = "Header Text" 
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap)) 
    tapRecognizer.delegate = self 
    tapRecognizer.numberOfTapsRequired = 1 
    tapRecognizer.numberOfTouchesRequired = 1 
    v.addGestureRecognizer(tapRecognizer) 
    return v 
} 

func handleTap(gestureRecognizer: UIGestureRecognizer) 
{ 
    print("Tapped") 
} 
Cuestiones relacionadas