Le séparateur UITableViewCell disparaît dans iOS7

129

J'ai un problème étrange UITableViewuniquement avec iOS 7.

UITableViewCellSeparatordisparaît au-dessus de la première ligne et en dessous de la dernière ligne. Parfois, après avoir sélectionné les lignes ou certaines actions de défilement, il apparaît.

Dans mon cas , tableViewest chargé de la Storyboardavec UITableViewStylePlainstyle. Le problème n'est sûrement pas dans UITableViewCellSeparatorStyle, ce qui n'est pas changé par défaut UITableViewCellSeparatorStyleSingleLine.

Comme je l'ai lu sur les forums Apple Dev ( ici et ici ), d'autres personnes ont un tel problème et certaines solutions de contournement sont trouvées, par exemple:

Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.

Mais je suis toujours à la recherche de la raison d'un tel comportement étrange de séparateur.

Des idées?

Mise à jour: comme je l'ai vu dans XCode 5.1 DP et iOS 7.1 beta, Apple a essayé de résoudre ce problème. Maintenant, le séparateur est affiché selon les besoins, parfois sous la dernière ligne, après un rafraîchissement, mais pas après la création de la tableview.

BS
la source
19
Parfois, j'ai l'impression qu'iOS7 est si immature. Ceci et la longue liste de choses que j'ai ici montrent à quel point iOS7 est loin de la perfection des iOS précédents.
Bms270 du
1
L'application Paramètres d'Apple a le même problème, donc je pense qu'il s'agit d'un problème iOS 7. Je l'ai signalé, et dans leur suivi, ils ont demandé des images montrant le problème.
Johan
@Gatada Où voyez-vous le problème dans l'application Paramètres?
Jamie Forrest
2
Rencontré le même problème et corrigé en ajoutant [cellule setSeparatorInset: UIEdgeInsetsFromString (@ "1")]; avec in (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) méthode indexPath
Ayesha Fatima
1
Cela semble toujours être cassé dans les bêtas d'iOS 8.0. J'ai ouvert le radar 17724043 si quelqu'un veut duper.
Andy Wilkinson

Réponses:

77

J'ai vidé la hiérarchie des sous-vues des cellules affectées et j'ai constaté que le _UITableViewCellSeparatorViewparamètre était défini sur masqué. Pas étonnant que ce ne soit pas montré!

J'ai remplacé layoutSubviewsdans ma UITableViewCellsous-classe et maintenant les séparateurs sont affichés de manière fiable:

Objectif-C :

- (void)layoutSubviews {
    [super layoutSubviews];

    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

Swift :

override func layoutSubviews() {
    super.layoutSubviews()

    guard let superview = contentView.superview else {
        return
    }
    for subview in superview.subviews {
        if String(subview.dynamicType).hasSuffix("SeparatorView") {
            subview.hidden = false
        }
    }
}

Les autres solutions proposées ici n'ont pas fonctionné de manière cohérente pour moi ou semblent maladroites (ajout de vues de pied de page personnalisées de 1 px).

Ortwin Gentz
la source
J'ai utilisé votre méthode mais pas dans la sous-classe, j'avais ajouté une catégorie à UITableViewCell. Ça m'a aidé. Merci.
Vitalii Boiarskyi
Bien sûr, c'est également possible dans une catégorie. Comme cela nécessite un swizzling de méthode, j'ai opté pour l'approche de sous-classe simple.
Ortwin Gentz
3
C'est la seule solution qui a fonctionné pour moi. Mon problème est apparu lorsque l'UITableView avait suffisamment de lignes pour pouvoir faire défiler. Cette partie "hasSuffix:" est cependant assez fragile.
juhan_h
Travaille pour moi. Peut-être que la question est idiote, mais n'est-ce pas l'utilisation de l'API privée?
Foriger
1
Fonctionne pour moi dans iOS9
tounaobun
42

Cela a fonctionné pour moi:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
samvermette
la source
Vous méritez plus de votes, c'est exactement ce dont j'avais besoin, je l'ai ajouté dans une catégorie, alors maintenant, après avoir fait [tableView reloadData], si ce bogue se produit (dans mon cas, le séparateur de pied de page qui était caché réapparaît), j'appelle [tableView reloadSeparators];
NiñoScript
12

J'ai aussi eu le problème avec séparateur manquant et j'ai découvert que le problème est survenu seulement quand heightForRowAtIndexPatha été le retour d' un nombre décimal . Solution:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return ceil(yourHeight) // Ceiling this value fixes disappearing separators
}
Emelie
la source
1
Qu'en est-il du cas si je n'implémente même pas la méthode heightForRowAtIndexPath?
BS
Intéressant. Cependant, cela se produit également dans mon projet - et heightForRowAtIndexPath n'est pas implémenté. Dans IB, la hauteur de la ligne / cellule est de 100.
Johan
6
Cela n'a pas résolu le problème pour moi et j'ai la méthode heightForRowAtIndexPath.
Gergely Kovacs
Résout le problème au moins partiellement. La cellule semble être confuse quant aux hauteurs non entières.
Nick Frolov
Vous devez plafonner le nombre de pixels, puis diviser par le facteur d'échelle de l'écran pour obtenir des points qui peuvent être en décimal. Si vous ne le faites pas, il ne sera pas optimisé pour la rétine.
trss
11

Avez-vous essayé d'ajouter un UIView de hauteur 1 dans l'en-tête et le pied de page du tableau avec une couleur de fond gris clair? En gros, cela se moquera du premier et du dernier séparateur.

airpaulg
la source
cela semble bien, mais comment faites-vous exactement cela? utiliser viewforfooter?
skinsfan00atg
1
n'est pas aussi facile que cela en a l'air, pour une raison quelconque, j'ai dû également implémenter heightforfooter, sinon la hauteur spécifiée dans initwithframe était ignorée. Je remarque également que le lightgraycolor n'est pas de la même couleur donc cela ne fonctionnera pas vraiment. pourrait avoir à faire un gris personnalisé
skinsfan00atg
c'est assez janky IMO
JackyJohnson
Ouais, je suis entièrement d'accord. C'est la seule solution de contournement que j'ai trouvée juste après la sortie d'iOS 7, y a-t-il une meilleure approche maintenant?
airpaulg
2
Pour faire correspondre la couleur, utilisez tableView.separatorColor
Jeff
8

@samvermette

J'ai résolu le problème en utilisant ces méthodes de délégué. Maintenant, il ne clignote pas:

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}


-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}

la source
7

Nous avons rencontré ce problème dans notre application. Lorsque l'utilisateur a sélectionné une cellule, une nouvelle vue de table a été poussée sur la pile du contrôleur de navigation, puis lorsque l'utilisateur l'a sautée, le séparateur était manquant. Nous l'avons résolu en mettant [self.tableView deselectRowAtIndexPath:indexPath animated:NO];dans la didSelectRowAtIndexPathméthode de délégué de vue table.

Wrightak
la source
Avez-vous essayé self.tableView.allowsMultipleSelection = NO;?
wrightak
6

Voici une solution de contournement plus simple (bien qu'un peu compliquée) si vous en avez besoin, essayez de sélectionner et de désélectionner la cellule une fois les données rechargées et l'animation par défaut terminée.

il suffit d'ajouter:

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
redmoon7777
la source
1
Cette solution de contournement l'a résolu pour moi; cependant, je l'ai inversé - pour conserver la sélection. Alors, désélectionnez d'abord, puis resélectionnez.
Johan
2
Je ne sais pas quoi remplacer lorsque vous dites "après le rechargement des données"
airpaulg
6

J'ai trouvé que la solution la plus simple est, après le rechargement d'une cellule, de recharger également la cellule ci-dessus:

if (indexPath.row > 0) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
}
conmulligan
la source
1
A travaillé pour moi. Merci. Toutes les autres méthodes ne m'ont pas aidé (inclure le changement de style de séparateur par rapport à la réponse de samvermette).
surfrider le
4

Une solution simple et propre qui fonctionne à la fois sur iOS 8 et iOS 9 (bêta 1)

Voici une solution de contournement simple, propre et non intrusive. Il s'agit d'appeler une méthode de catégorie qui corrigera les séparateurs.

Tout ce que vous avez à faire est de parcourir la hiérarchie de la cellule et de décocher le séparateur. Comme ça:

for (UIView *subview in cell.contentView.superview.subviews) {
    if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
        subview.hidden = NO;
    }
}

Ce que je recommande est d'ajouter ceci à une catégorie sur UITableViewCell, comme ceci:

@interface UITableViewCell (fixSeparator)
- (void)fixSeparator;
@end

@implementation UITableViewCell (fixSeparator)

- (void)fixSeparator {
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

@end

Étant donné que le séparateur peut disparaître dans une cellule différente de celle actuellement sélectionnée, il est probablement judicieux d'appeler ce correctif sur toutes les cellules de la vue tableau. Pour cela, vous pouvez ajouter une catégorie à UITableView qui ressemble à ceci:

@implementation UITableView (fixSeparators)

- (void)fixSeparators {
    for (UITableViewCell *cell in self.visibleCells) {
        [cell fixSeparator];
    }
}

@end

Avec cela en place, vous pouvez appeler -fixSeparatosvotre tableView juste après l'action qui les fait disparaître. Dans mon cas, c'était après avoir appelé [tableView beginUpdates]et [tableView endUpdates].

Comme je l'ai dit au début, j'ai testé cela sur iOS 8 et iOS 9. Je suppose que cela fonctionnera même sur iOS 7, mais je n'ai aucun moyen de l'essayer là-bas. Comme vous le savez probablement, cela manipule les éléments internes de la cellule afin qu'elle puisse cesser de fonctionner dans une version ultérieure. Et Apple pourrait théoriquement (0,001% de chance) rejeter votre application à cause de cela, mais je ne vois pas comment ils pourraient même découvrir ce que vous faites là-bas (vérifier le suffixe d'une classe ne peut pas être détecté par les analyseurs statiques comme quelque chose mauvais, OMI).

Lukas Petr
la source
OUI. Cela a fonctionné pour moi, après la conversion vers la dernière version de Swift. ++ pour appeler fixSeparators après chaque appel à tableView.endUpdates ().
ObjectiveTC
1
Je suis heureux que cela vous ait été utile! Je crois vraiment que c'est la meilleure solution, donc j'espère que plus de gens la découvriront.
Lukas Petr
4

Basé sur le commentaire de @ ortwin-gentz, cette solution fonctionne pour moi dans iOS 9.

func fixCellsSeparator() {

    // Loop through every cell in the tableview
    for cell: UITableViewCell in self.tableView.visibleCells {

        // Loop through every subview in the cell which its class is kind of SeparatorView
        for subview: UIView in (cell.contentView.superview?.subviews)!
            where NSStringFromClass(subview.classForCoder).hasSuffix("SeparatorView") {
                subview.hidden = false
        }
    }

}

(Code rapide)

J'utilise la fonction fixCellsSeparator () après avoir appelé endUpdates () dans certaines méthodes de ma tableView, par exemple:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //  Perform some stuff
    //  ...

    self.tableView.endUpdates()
    self.fixCellsSeparator()

}

J'espère que cette solution sera utile pour quelqu'un!

Carlos D. Álvaro
la source
2

Complément à la réponse de airpaulg.

Donc, fondamentalement, il faut implémenter deux méthodes UITableDelegate. Voici ma solution qui fonctionne à la fois sur iOS7 et iOS6.

#define IS_OS_VERSION_7 (NSFoundationVersionNumber_iOS_6_1 < floor(NSFoundationVersionNumber))

#define UIColorFromRGB(hexRGBValue) [UIColor colorWithRed:((float)((hexRGBValue & 0xFF0000) >> 16))/255.0 green:((float)((hexRGBValue & 0xFF00) >> 8))/255.0 blue:((float)(hexRGBValue & 0xFF))/255.0 alpha:1.0]

// Cela masquera la grille de tableau vide sous les cellules si elles ne couvrent pas tout l'écran

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    UIView *view = nil;

    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        CGFloat height = 1 / [UIScreen mainScreen].scale;
        view = [[UIView alloc] initWithFrame:CGRectMake(0., 0., 320., height)];
        view.backgroundColor = UIColorFromRGB(0xC8C7CC);
        view.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    }
    else
    {
        view = [UIView new];
    }
    return view;
}


- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        return 1 / [UIScreen mainScreen].scale;
    }
    else
    {
        // This will hide the empty table grid below the cells if they do not cover the entire screen
        return 0.01f;
    }
}
ivohad
la source
2

Cela a résolu le problème pour moi:

Assurez-vous que la valeur clipsToBoundsest OUI pour la cellule, mais NON pour la cellule contentView. Définir égalementcell.contentView.backgroundColor = [UIColor clearColor];

JimmyB
la source
La définition de clipSubviews sur false dans le storyboard pour la cellule et le contentView a résolu le problème! Besoin de plus de votes!
Brett
Définir clipsToBounds sur YES sur les cellules me suffisait.
René Juuse
2

On dirait que ce problème se manifeste dans de nombreuses circonstances.

Pour moi, cela avait quelque chose à voir avec la sélection des cellules. Je ne sais pas pourquoi et je n'ai pas eu le temps de creuser trop profondément, mais je peux dire que cela a commencé à se produire lorsque j'ai mis la cellule selectionStyleà zéro. c'est à dire:

//This line brought up the issue for me
cell.selectionStyle = UITableViewCellSelectionStyleNone;

J'ai essayé d'utiliser certaines des méthodes de délégué ci-dessus qui activent et désactivent le separatorStyle propriété du, tableViewmais elles ne semblent rien faire pour résoudre mon problème.

La raison pour laquelle j'en avais besoin était parce que je n'avais même pas besoin de sélection de cellule.

Donc, j'ai trouvé quelque chose qui a fonctionné pour moi. Je viens de désactiver la sélection sur UITableView:

tableView.allowsSelection = NO;

J'espère que cela aide quelqu'un, si vous n'avez pas besoin de sélectionner une cellule.

Arjun Mehta
la source
2

J'ai essayé tant de suggestions pour corriger mais je ne peux pas résoudre ce problème.Enfin, j'ai décidé de personnaliser la ligne de séparation comme ci-dessous:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    var lineView = UIView(frame: CGRectMake(20, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width - 20, 1))

    lineView.backgroundColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1)
    cell.contentView.addSubview(lineView)
}

P / S: personnalisé à willDisplayCell NOT cellForRowAtIndexPath

Lee
la source
1

De manière assez surprenante, changer la separatorInsetvaleur de la cellule dans les deux sens semble fonctionner:

NSIndexPath *selectedPath = [self.controller.tableView indexPathForSelectedRow];
[self.controller.tableView deselectRowAtIndexPath:selectedPath animated:YES];

UITableViewCell *cell = [self.controller.tableView cellForRowAtIndexPath:selectedPath];
UIEdgeInsets insets = cell.separatorInset;
cell.separatorInset = UIEdgeInsetsMake(0.0, insets.left + 1.0, 0.0, 0.0);
cell.separatorInset = insets;
Bartosz Ciechanowski
la source
1

J'ai également eu le problème de cet affichage de ligne de séparation incohérent au bas de mon UITableView. En utilisant une vue de pied de page personnalisée, j'ai pu créer une ligne similaire et l'afficher au-dessus de celle existante potentielle (qui manquait parfois).

Le seul problème de cette solution est qu'Apple peut changer un jour l'épaisseur du trait

- (UIView*) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    float w = tableView.frame.size.width;

    UIView * footerView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, w, 1)];
    footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    footerView.clipsToBounds=NO;

    UIView* separatoraddon = [[UIView alloc] initWithFrame:CGRectMake(0, -.5, w, .5)];
    separatoraddon.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    separatoraddon.backgroundColor = tableView.separatorColor;
    [footerView addSubview:separatoraddon];

    return footerView;
}
- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 1;
}
Paco_777
la source
1

J'ai résolu de mettre ces lignes de code là où la mise à jour de la tableview se produit:

self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;

Par exemple, dans mon cas, je les ai mis ici:

tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(insertIndexPaths, withRowAnimation: UITableViewRowAnimation.Fade)
tableView.endUpdates()
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;
Andorath
la source
1

Vous devez supprimer une sélection de cellule avant de procéder à la mise à jour de la cellule. Ensuite, vous pouvez restaurer la sélection.

NSIndexPath *selectedPath = [self.tableview indexPathForSelectedRow];
    [self.tableview deselectRowAtIndexPath:selectedPath animated:NO];
    [self.tableview reloadRowsAtIndexPaths:@[ path ] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableview selectRowAtIndexPath:selectedPath animated:NO scrollPosition:UITableViewScrollPositionNone];
Voloda2
la source
1

Pour résoudre le problème ci-dessus, ajoutez un pied de page vide dans viewDidLoad.

UIView *emptyView_ = [[UIView alloc] initWithFrame:CGRectZero];   
emptyView_.backgroundColor = [UIColor clearColor];  
[tableView setTableFooterView:emptyView_];

Veuillez ne pas utiliser les lignes ci-dessus dans la méthode déléguée viewForFooterInSection. Signifie Ne pas implémenter la méthode viewForFooterInSection.

Suresh Durishetti
la source
0

pour développer la réponse airpaulg, car cela n'a pas entièrement fonctionné pour moi ..

j'ai dû également implémenter la méthode heightforfooter pour obtenir la hauteur

puis j'ai remarqué que la couleur gris clair est trop sombre. J'ai corrigé cela en saisissant la couleur de séparation actuelle de la vue de la table et en l'utilisant:

UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];

skinsfan00atg
la source
0

J'ai également rencontré ce problème dans notre projet. Ma vue de table avait une tableFooterView qui pourrait y arriver. J'ai trouvé que le séparateur sous la dernière ligne apparaîtrait si je supprimais cette tableFooterView.

xT_Tx
la source
0

Ce qui a fait la différence pour moi a été de recharger la ligne pour laquelle la ligne de séparation du bas n'apparaît pas:

NSIndexPath *indexPath = 
     [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];  
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
Don Miguel
la source
0

Je résous ce problème d'une autre manière: ajoutez un calque dont la hauteur est de 0,5 px et sa couleur est gris clair dans tableview.tableFooterView comme sous-calque.

le code est juste comme ça:

UIView *tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
CALayer *topSeperatorLine = [CALayer layer];
topSeperatorLine.borderWidth = 0.5f;
topSeperatorLine.borderColor = [UIColor lightGrayColor].CGColor;
topSeperatorLine.frame = CGRectMake(0, 0, 320, 0.5f);
[tableFooterView.layer addSublayer:topSeperatorLine];
self.tableView.tableFooterView = tableFooterView;
jianpx
la source
0

Dans votre UITableViewCell, implémentez layoutSubviews et ajoutez:

- (void)layoutSubviews{
    [super layoutSubviews]
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            CGRect separatorFrame = subview.frame;
            separatorFrame.size.width = self.frame.size.width;
            subview.frame = separatorFrame;
        }
    }
}
Giorgos Ath
la source
0

Comme quelqu'un l'a mentionné, ce problème semble se manifester de diverses manières. J'ai résolu mon problème via la solution de contournement suivante:

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];
chinabuffet
la source
0

En parcourant les réponses et les solutions, j'ai trouvé de telles observations:

Cela semble être problématique dans iOS 7 et 8. J'ai remarqué le problème lors de la sélection de la cellule à partir du code dans viewDidLoad méthode:

1) La solution de contournement le faisait viewDidAppear:si quelqu'un ne se soucie pas du délai notable entre la présentation de la vue et la sélection de la cellule

2) la deuxième solution a fonctionné pour moi mais le code semble un peu fragile car il repose sur l'implémentation interne duUITableViewCell

3) l'ajout de son propre séparateur semble être le plus flexible et le meilleur pour le moment, mais nécessite plus de codage :)

Julian Król
la source
0

Définir le style a viewWillAppearfonctionné pour moi.

villy393
la source
0

Comme il s'agit toujours d'un problème avec IOS 8, j'ajouterai ma solution dans Swift. Définissez la ligne de séparation tableview sur aucun. Ajoutez ensuite ce code à la méthode de délégué cellForRowAtIndexPath. Cela ajoutera un joli séparateur. L'instruction if permet de décider quelles cellules doivent avoir un séparateur.

    var separator:UIView!
    if let s = cell.viewWithTag(1000)
    {
        separator = s
    }
    else
    {
        separator = UIView()
        separator.tag = 1000
        separator.setTranslatesAutoresizingMaskIntoConstraints(false)
        cell.addSubview(separator)

        // Swiper constraints
        var leadingConstraint = NSLayoutConstraint(item: separator, attribute: .Leading, relatedBy: .Equal, toItem: cell, attribute: .Leading, multiplier: 1, constant: 15)
        var heightConstraint = NSLayoutConstraint(item: separator, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0.5)
        var bottomConstraint = NSLayoutConstraint(item: cell, attribute: .Bottom, relatedBy: .Equal, toItem: separator, attribute: .Bottom, multiplier: 1, constant:0)
        var trailingConstraint = NSLayoutConstraint(item: cell, attribute: .Trailing, relatedBy: .Equal, toItem: separator, attribute: .Trailing, multiplier: 1, constant: 15)
        cell.addConstraints([bottomConstraint, leadingConstraint, heightConstraint, trailingConstraint])
    }

    if indexPath.row == 3
    {
        separator.backgroundColor = UIColor.clearColor()
    }
    else
    {
        separator.backgroundColor = UIColor.blackColor()
    }
Bjørn Ruthberg
la source
0

Voici ma solution à ce problème. Après avoir inséré votre (vos) cellule (s), rechargez la section. Si le rechargement de la section entière est trop intensif pour vous, rechargez simplement les indexPaths ci-dessus et ci-dessous.

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    //  Fix for issue where seperators disappear

    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}];

[self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade];

[CATransaction commit];
mattsven
la source
0

rencontré un problème similaire, j'ai trouvé qu'une autre bonne solution, surtout si votre dataSource n'est pas volumineuse, est de recharger la tableData lorsque vous implémentez la -(void)scrollViewDidScroll:(UIScrollView *)scrollViewméthode, voici un exemple:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
      if (scrollView == self.tableView1) {
          [self.tableView1 reloadData];
      }

      else {
          [self.tableView2 reloadData];
      }
}

Vous pouvez également simplement recharger des données non visibles en fonction de la source de données visible, mais cela nécessite un peu plus de piratage.

Gardez à l'esprit que cette fonction de délégué relève du UITableViewDelegate protocole!

J'espère que ça aide!

smahmood11
la source