ios - example - uitableview swift 3
uitableviewcontroller seleccione el encabezado para la sección (4)
Tengo un UITableView con múltiples secciones. Cada sección tiene un encabezado de sección (una vista personalizada) ¿hay una manera fácil de detectar cuándo alguien selecciona el encabezado de la sección? (Al igual que didSelectRowAtIndexPath, pero para el encabezado?)
Gracias por adelantado.
Esto 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")
}
Esto funcionó para evaluar la sección y la fila. Espero que ayude a todos los que están luchando para conseguir este trabajo correctamente ...
override func viewDidLoad() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(sectionTapped(sender:)))
tableView?.addGestureRecognizer(tapGesture)
tapGesture.delegate = self as? UIGestureRecognizerDelegate
}
@objc func sectionTapped(sender: UITapGestureRecognizer) {
if sender.state == UIGestureRecognizerState.ended {
guard let tableView = self.tableView else {
return
}
if let view = sender.view {
let tapLocation = sender.location(in: tableView)
if let tapIndexPath = tableView.indexPathForRow(at: tapLocation) {
if (tableView?.cellForRow(at: tapIndexPath) as? UITableViewCell) != nil {
// do something with the row
print("tapped on row at index: /(tapIndexPath.row)")
}
} else {
for i in 0..<tableView.numberOfSections {
let sectionHeaderArea = tableView.rectForHeader(inSection: i)
if sectionHeaderArea.contains(tapLocation) {
// do something with the section
print("tapped on section at index: /(i)")
}
}
}
}
}
}
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 agregar un UITapGestureRecognizer a mi vista de encabezado en lugar de agregar botones invisibles y redimensionarlos:
UITapGestureRecognizer *singleTapRecogniser = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease];
[singleTapRecogniser setDelegate:self];
singleTapRecogniser.numberOfTouchesRequired = 1;
singleTapRecogniser.numberOfTapsRequired = 1;
[yourHeaderView addGestureRecognizer:singleTapRecogniser];
y entonces:
- (void) handleGesture:(UIGestureRecognizer *)gestureRecognizer;
Puedes usar gesto. Ver para ver cuál fue tocado. Luego, haga lo que tenga que hacer para averiguar qué encabezado era (etiquetas, búsqueda de matriz de datos ...)
No, no hay manera de hacerlo con el UITableViewDelegate
.
Lo que puede hacer es agregar un botón del tamaño de la vista de encabezado de sección y agregarlo a la vista. Establezca la etiqueta del botón en el índice de la sección. Luego simplemente agregue el UIViewController
como objetivo para el UIControlEventTouchUpInside
.
Luego, mirando la etiqueta del botón, puede ver en qué sección se hace clic.