web-dev-qa-db-fra.com

UITableViewController select header pour la section

J'ai une UITableView avec plusieurs sections. Chaque section a un en-tête de section (une vue personnalisée). Existe-t-il un moyen facile de détecter le moment où quelqu'un sélectionne l'en-tête de section? (Juste comme didSelectRowAtIndexPath, mais pour l'en-tête?)

29
klyngbaek

Non, il n'y a aucun moyen de le faire avec la variable UITableViewDelegate.

Ce que vous pouvez faire est d'ajouter un bouton de la taille de la vue d'en-tête de section et de l'ajouter à la vue. Définissez la balise du bouton sur l'index de section . Ajoutez ensuite simplement UIViewController comme cible pour UIControlEventTouchUpInside 

Ensuite, en regardant la balise du bouton, vous pouvez voir quelle section est cliquée.

27
rckoenes

Ce n'est pas radicalement différent de @rckoenes answer, mais cela fournit un moyen plus orthodoxe de gérer les événements sur les vues plutôt que d'utiliser des boutons invisibles.

Je préférerais ajouter UITapGestureRecognizer à la vue en-tête plutôt que d'ajouter des boutons invisibles et de les redimensionner:

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

et alors:

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

Vous pouvez utiliser gesture.view pour voir ce qui a été touché. Ensuite, faites tout ce que vous devez faire pour trouver l’en-tête dont il s’agissait (balises, recherche de tableaux de données, etc.).

64
bandejapaisa

Voici ce qui a fonctionné pour moi dans 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")
}
4
hkdalex

Cela a fonctionné pour évaluer la section et la rangée. J'espère que cela aidera tout le monde qui a du mal à faire ce travail correctement ...

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)")
                    }
                }
            }
        }
    }
}
0
tsuz