web-dev-qa-db-fra.com

Balayer pour supprimer la cellule provoque le déplacement de tableViewHeader avec la cellule.

J'ai rencontré un bogue étrange avec ma tableViewHeader sur ma UITableView dans iOS 8. Lorsque vous faites glisser une cellule pour afficher le bouton de suppression (le balayage standard iOS pour supprimer), il déplace la tableViewHeader avec la cellule balayée. Lorsque je glisse la cellule, l'en-tête se déplace de la même façon que la cellule en train d'être balayée. Aucune autre cellule de la vue tableau n'est déplacée, seul l'en-tête et la cellule balayée. J'ai testé cela sur iOS 7 n'a pas rencontré le problème. Pour moi, cela ressemble à un bogue avec tableViewHeader dans iOS 8, car cela ne se produit que dans cette version et semble quelque chose qui ne devrait jamais se produire. Je ne vois aucune raison pour que l'en-tête soit jamais inclus dans le glissement-pour-supprimer.

Ci-dessous est juste une maquette. Glisser-supprimer dans l'application est par défaut iOS, rien de personnalisé.

Below is just a mockup. Swipe-to-delete within the app is default iOS, nothing custom.

53
ferris

En me basant sur la réponse de ferris, j'ai trouvé que le moyen le plus simple d'utiliser un UITableViewCell comme en-tête de section est de renvoyer le contentView de la cellule dans viewForHeaderInSection. Le code est comme suit:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let  cell : cellSectionHeader = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as cellSectionHeader
    return cell.contentView
    //cellSectionHeader is my subclassed UITableViewCell
}
49
Brad C

Cela était dû au fait que j'utilisais UITableViewCell comme en-tête de la table. Pour résoudre le problème de balayage, au lieu d'utiliser tableView.tableHeaderView = cell, j'utilise ce qui suit:

UIView *cellView = [[UIView alloc] init];
[cellView addSubview:cell];
tableView.tableHeaderView = cellView

Je ne sais pas pourquoi cela résout le problème, en particulier parce que cela a fonctionné sur iOS 7, mais cela semble résoudre le problème.

Assurez-vous d’ajouter toutes les vues à la vue des cellules, comme supposé aux cellules contentView, sinon les boutons ne seront pas réactifs. 

Travaux:

[cell addSubview:view]; ou [self addSubview:view];

Ne fonctionne pas:

[cell.contentView addSubview:view] ou [self.contentView addSubview:view]

25
ferris

Pour éviter que les en-têtes ne se déplacent avec les cellules, vous devez renvoyer le contentView de la cellule dans viewForHeaderInSection. Si vous avez une UITableViewCell sous-classe nommée SectionHeaderTableViewCell, voici le code correct:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    SectionHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionHeader"];
    //Do stuff to configure your cell
    return cell.contentView; 
}
9
bodagetta

Swift 3.0 Solution testée. Comme mentionné dans le premier exemple pour Objective-C; le point clé est de retourner cell.contentView au lieu de cell Donc la nouvelle syntaxe de formatage est la suivante.

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

    // HeaderCell is the name of custom row designed in Storyboard->tableview->cell prototype
    let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell")

    cell.songLabel.text = "Your Section Name"
    return cell.contentView
}
3
Trevor

Un problème non mentionné avec la méthode .contentView est que si votre cellule de vue tableau utilise layoutSubviews, vous risquez de ne pas obtenir le comportement souhaité - car layoutSubviews ne sera pas appelé. J'ai fini par créer une sous-classe UIView entièrement distincte qui prend en charge les opérations de cellule normales et d'en-têtes, et de créer une classe de cellules UITableView minimale qui l'utilise.

0
Chris Prince

Essayez d'implémenter cette méthode et donnez les conditions appropriées pour vérifier le balayage. Si cette méthode est appelée pour la vue d'en-tête.

1.tableView: montageStyleForRowAtIndexPath: 2.tableView: titleForDeleteConfirmationButtonForRowAtIndexPath: 3.tableView: shouldIndentWhileEditingRowAtIndexPath:

0
iOSdev