Quelqu'un at-il une idée de comment déboguer cela?
Avertissement une fois seulement: Détection d'un cas où des contraintes suggèrent de manière ambiguë une hauteur de zéro pour la vue de contenu d'une cellule de table. Nous envisageons l’effondrement involontaire et utilisons plutôt la hauteur standard.
Les lignes ont une hauteur fixe définie par
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 34.0;
}
Et tous les constraints
semblent être heureux ...
Forcer une hauteur de retour et une hauteur estimée a fait disparaître l'avertissement dans mon cas.
- (CGFloat)tableView:(UITableView *)tableView
estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
Une autre solution pour laquelle vous n'avez pas besoin des deux substitutions consiste simplement à utiliser self.tableView.rowHeight = 44;
dans votre méthode loadView
ou init.
Vous pouvez également ajouter des contraintes verticales à partir du haut et du bas de la vue du contenu. Cela rendra l'autolayout heureux (car il sait maintenant calculer lui-même la hauteur de la cellule).
Si vous utilisez des contraintes autoLayout et UITableViewAutomaticDimension, cette erreur ne constitue pas un problème erroné à ignorer en remplaçant votre hauteur dans le code. Cela signifie que la détermination automatique de la hauteur de la cellule ne fonctionne pas car vous ne disposez pas des contraintes verticales requises.
Si vous êtes comme moi et que vous rencontrez cette erreur et que vous avez besoin d'aide pour identifier la cellule à l'origine de l'erreur, vous pouvez ajouter la ligne suivante juste avant le retour de votre méthode 'heightforRowAtIndexPath'.
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
Cela affichera une longue liste de sections et de lignes, mais l'erreur apparaîtra immédiatement après la cellule en particulier, ce qui vous permettra d'identifier rapidement la cellule à l'origine du problème et de corriger vos contraintes en conséquence. Ceci est particulièrement utile pour les cellules statiques. Remplacer la hauteur par un nombre entré manuellement fonctionnera si vous n'utilisez pas autoLayout et les hauteurs de cellule automatiques, mais désactivera essentiellement ces fonctionnalités, ce qui est une très mauvaise solution si vous essayez de l'utiliser.
Si vous n'utilisiez pas précédemment la méthode 'heightForRowAtIndexPath' mais souhaitez déboguer cette erreur sans annuler votre paramètre UITableViewAutomaticDimension, ajoutez simplement ceci à votre code:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
return UITableViewAutomaticDimension;
}
Il semble y avoir un bogue dans XCode 6.1 qui pose ce problème si vous utilisez la disposition automatique et que vous ne spécifiez pas de valeur pour la hauteur de ligne pour chaque cellule de la vue tableau, mais laissez la valeur "par défaut". En cochant simplement la case "Personnalisé" en regard de la hauteur de la ligne, pour chaque cellule, l'avertissement disparaît.
Oui, vous obtenez toutes les contraintes "heureuses" même dans le cas où vous ne disposez que de contraintes horizontales pour les éléments de la cellule de la vue tableau. J'ai eu le même problème. Vous devez également ajouter des contraintes verticales. Ce faisant, cet avertissement disparaîtra.
J'ai utilisé Row Height 43 (ou <> 44) dans l'inspecteur de taille de la vue tableau et l'erreur a disparu. En utilisant 44 je reçois l'erreur. Xcode version 6.0.1.
- Cette réponse a été supprimée par un modérateur. Merci de ne pas corriger le problème. Cela résout le problème pour moi et peut le faire pour les autres aussi. Alors, pourriez-vous avoir la gentillesse de ne pas le supprimer à nouveau.
Les contraintes peuvent être heureuses pour la mise en page, mais pas pour la hauteur de ligne automatique. Une mise en page heureuse signifierait que le contenu peut être présenté sans ambiguïté. Cela satisferait aux vérifications d'Interface Builder.
Une bonne disposition de la hauteur de ligne automatique signifierait qu'en plus de ce qui précède, vous incluez également des contraintes au bas de la cellule.
Plus ici: Détection d'un cas où des contraintes suggèrent de manière ambiguë une hauteur de zéro
Si vous recevez cet avertissement, c'est probablement parce que vous utilisez la mise en page automatique et que vos cellules ne sont soumises à aucune contrainte.
Vous devez soit arrêter d'utiliser la mise en page automatique, soit mettre en œuvre des contraintes qui définissent sans ambiguïté la hauteur des cellules.
Vous pouvez désactiver la mise en page automatique dans le générateur d'interface en décochant l'option "Utiliser autolayout" dans l'inspecteur de fichier de droite.
Si vous choisissez d'utiliser la mise en page automatique et que la hauteur de vos cellules est fixe, l'implémentation des contraintes appropriées devrait être simple. Ajoutez simplement des contraintes de hauteur pour les sous-vues de la vue de contenu de la cellule et implémentez des contraintes d'espace vertical entre les sous-vues et entre les sous-vues et la vue de contenu. Par exemple, si votre cellule contient une étiquette, cela fonctionnera:
contraintes verticales
contraintes horizontales
Je ne pouvais pas supprimer l'avertissement, mais pour que les contraintes fonctionnent correctement, je définissais la nouvelle propriété de vue de table estimatedRowHeight
dans iOS8 à la hauteur fixée et supprimais heightForRowAtIndexPath
la mise en oeuvre.
Vous pouvez utiliser AutoLayout pour calculer la hauteur qui vous convient. Voici un article de Nice sur Dynamic Cell Height sur iOS 8: http://natashatherobot.com/ios-8-self-sizing-tizing-table-view-cells-with-dynamic-type/
Pour un correctif standard de bog, pas de contrainte, pas d'estimation de hauteur, ni trop d'ingénierie du problème. J'ai créé un projet par défaut, câblé la tableview mais oublié de mettre le délégué de hauteur dans le contrôleur de vue. Pour que cet avertissement disparaisse, vous en avez besoin.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 44;
}
Dans le contrôleur de vue de votre table.
Dans Swift forçant une hauteur de retour corrigé mon problème:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if(indexPath.row == 0){
return CGFloat(131.0)
}else if(indexPath.row == 8){
return CGFloat(97.0)
}else{
return CGFloat(44.0)
}
}
J'utilisais une carte dans uitableviewcell. J'ai changé la hauteur de l'affichage de la carte en 1/3 de la taille de l'écran de l'appareil. J'ai eu la même erreur. J'ai corrigé l'erreur en ajoutant des contraintes manquantes à la vue du contenu de la cellule uitableview.
1) Supprimez les contraintes contentView.
2) Définissez Réinitialiser sur Constantes suggérées sur contentView.
3) Ajouter les contraintes manquantes - le cas échéant
4) Nous nous assurons que la vue du contenu a toutes les contraintes requises.
Je pense que deux choses importantes se passent ici.
1) Il est très facile de rendre les contraintes fausses si vous appuyez sur ctrl + glisser. Alors, vérifiez que vous l'avez fait correctement. Il est préférable d’utiliser le bac situé à gauche de l’écran pour dessiner ces contraintes.
2) Plutôt que de spécifier l'estimationRowHeight dans ViewDidLoad ou ailleurs, utilisez la méthode delegate
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}
Cela a résolu le problème tout de suite pour moi.
J'ai tourné en rond pendant des jours entre cette erreur et une autre erreur dans laquelle des contraintes étaient créées (aucune idée de l'endroit) qui entrait en conflit avec les contraintes que je recherchais. Je l'ai même eu dans un cas où chaque propriété visible était identique à l'autre. La seule solution que j'ai trouvée était de devenir atomique - créez un fichier entièrement nouveau avec xib et recommencez à reconnecter les prises en copiant-collant l'ancien code. Ce n'est peut-être pas la meilleure solution, mais parfois, si le problème n'est pas visible, il n'y a pas grand-chose à faire. À tout le moins, adopter l’atome est un bon moyen de faire le point sur ce qui se passe.
Dans mon cas, c’est parce que je conçois la cellule avec xib et j’oublie d’ajouter ce fichier xib à la cible.
Après avoir ajouté ce fichier xib à la cible, le problème a disparu
Bien que les réponses de cette page traitant de l'ajout de contraintes de hauteur ou du renvoi manuel de rowHeights comme 44 dans heightForRowAtIndexPath entraînent la disparition de l'avertissement, elles sont superflues car il s'agit d'un bogue dans Xcode visible dans au moins la version 6.3.2. (6D2105).
Si vous définissez un point d'arrêt dans viewDidLoad, vous verrez que self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) même si vous spécifiez une hauteur de ligne de 44 dans le storyboard. En effet, Apple suppose à tort que vous souhaitez des hauteurs de ligne dynamiques si vous laissez la hauteur de ligne à 44, car ils ne vous ont pas fourni d'indicateur pour spécifier votre préférence.
Voici quelques solutions possibles et leurs résultats:
Définissez la hauteur des rangées sur 43 ou 45 dans le scénario (travaux).
Retourne manuellement une hauteur de 44 dans heightForRowAtIndexPath (works).
Ajouter des contraintes de hauteur entre les éléments UITableViewCell et son contentView (works).
Malheureusement, ces solutions vous obligent à modifier votre conception, à ajouter des contraintes inutiles ou à ajouter du code inutile pour contourner un bogue. J'ai essayé (ce que je pensais être) la solution la plus simple:
Je voulais vraiment une solution de scénarimage pure, alors j'ai finalement essayé:

Ces bogues sont trop fréquents dans le développement iOS et obligent les développeurs à passer trop de temps à peser les conséquences de leurs solutions sur la maintenabilité à long terme.
Puisque trouver une solution conceptuellement correcte qui est maintenable et qui ne semble pas obscurcie est si difficile à atteindre, et en supposant que Apple corrigera le bogue et que 44 sera la hauteur de ligne par défaut pour les prévisions futures, les solutions d'attributs d'exécution contraintes ou définies par l'utilisateur sont probablement les plus faciles à gérer.
J'ai également constaté cette erreur lors de l'utilisation de storyboards ou de xibs universels. Si vous oubliez de spécifier les contraintes appropriées pour la classe de taille Any x Any, j'ai vu cette erreur se produire.
Apple semble avoir résolu ce problème pour iOS9. L'erreur ne s'est produite que sur 8.4 pour moi.