Définition d'un label de UITableView de tableFooterView - avec mise en page automatique

Quand ma vue de la table est vide, je veux ajouter une simple étiquette dans le tableview pied de page pour afficher un "non" contenu du message. Ça marchait très bien quand j'ai été la mise en images de la UILabel et la UIView que j'ai utilisé pour footerView, mais maintenant, je vais essayer de le convertir à l'aide de l'auto-mise en page, et je ne peux pas le faire fonctionner.

Voici ce que j'ai fais:

//Create the footer    
UIView *tempFooter = [[UIView alloc] init];
UILabel *atext = [[UILabel alloc] init];
tempFooter.translatesAutoresizingMaskIntoConstraints = NO;
atext.translatesAutoresizingMaskIntoConstraints = NO;
atext.numberOfLines = 0;
[atext setText:@"Add Some Text"];
atext.textAlignment = NSTextAlignmentCenter;
atext.font = [UIFont italicSystemFontOfSize:14];
atext.textColor = [UIColor grayColor];
atext.backgroundColor = [UIColor clearColor];
atext.lineBreakMode = NSLineBreakByWordWrapping;
//add label to footer view, and add constraints
[tempFooter addSubview:atext];
NSLayoutConstraint *tvatt1 = [NSLayoutConstraint constraintWithItem:tempFooter
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:atext attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:10.0];
NSLayoutConstraint *tvatt2 = [NSLayoutConstraint constraintWithItem:tempFooter
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:atext
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:10.0];
NSLayoutConstraint *tvatt3 = [NSLayoutConstraint constraintWithItem:tempFooter
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:atext
attribute:NSLayoutAttributeTop
multiplier:5.0
constant:0];
NSLayoutConstraint *tvatt4 = [NSLayoutConstraint constraintWithItem:tempFooter
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:atext
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant: 0];
[tempFooter addConstraints: @[tvatt1, tvatt2, tvatt3, tvatt4]];
//set the footerview 
self.tview.tableFooterView = tempFooter;

Lorsque je l'exécute, j'ai eu un crash:

2014-09-08 19:57:16.594 SimpleList[49442:60b] * échec d'Assertion dans
-[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794 2014-09-08
19:57:21.073 SimpleList[49442:60b] *
Résiliation d'application en raison de uncaught
exception NSInternalInconsistencyException', la raison: 'Mise en page Automatique
toujours requis après l'exécution d'-layoutSubviews. UITableView de l'
la mise en œuvre de layoutSubviews besoins à l'appel de super

Je ne suis pas sûr de ce que je fais mal. J'ai aussi essayé l'ajout de contraintes pour la self.tview.tableFooterView wrt l' tempFooter (pinning contre toutes les 4 côtés) mais cela ne change pas le crash. J'ai aussi l'appeler:

[self.tview.tableFooterView layoutSubviews];

mais ça n'aide pas non plus.

Les idées de ce que je fais mal?

Essayez commentant la ligne, tempFooter.translatesAutoresizingMaskIntoConstraints = NON; et voir si cela résout le problème.
Non, malheureusement les résultats dans un autre crash: 2014-09-08 22:46:19.905 Incapable de satisfaire simultanément des contraintes. Probablement au moins une des contraintes dans la liste suivante est une que vous ne voulez pas.... ( "<NSLayoutConstraint:0x117137d80 V:[UIView:0x10dfd5170(17)]>", "<NSAutoresizingMaskLayoutConstraint:0x117082480 h=--& v=--& V:[UIView:0x10dfd5170(0)]>" )
Cette nouvelle erreur est causée par le pas de hauteur définie pour le pied de page vue (de sorte qu'il sera de 0), mais ayant des contraintes pour le haut et le bas pour un label qui a une valeur non nulle de la hauteur. Voir ma réponse.

OriginalL'auteur Z S | 2014-09-09