iOS8 - Einschränkungen deuten mehrdeutig auf eine Höhe von Null hin

100

Hat jemand eine Idee, wie man das debuggt?

Warnung nur einmal: Es wurde ein Fall festgestellt, in dem Einschränkungen mehrdeutig eine Höhe von Null für die Inhaltsansicht einer Tabellenansichtszelle vorschlagen. Wir betrachten den Zusammenbruch als unbeabsichtigt und verwenden stattdessen die Standardhöhe.

Die Zeilen haben eine feste Höhe wie von festgelegt

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   return 34.0;
}

Und alle constraintsscheinen glücklich zu sein ...

Chris
quelle

Antworten:

129

Durch das Erzwingen einer Rücklaufhöhe und der geschätzten Höhe verschwand die Warnung in meinem Fall.

- (CGFloat)tableView:(UITableView *)tableView 
           estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}

Eine andere Lösung, bei der Sie die beiden Überschreibungen nicht benötigen, ist die Verwendung self.tableView.rowHeight = 44;in Ihrer loadViewoder init-Methode.

FBronner
quelle
1
Ich habe mehrere Typzeilen im Abschnitt und nur eine davon hat eine dynamische Höhe. dann funktioniert es nicht
Raj Aggrawal
Wenn wir die Standardhöhe in xib / storyboard festlegen, müssen wir diese Methoden nicht implementieren.
Satyam
77

Sie können auch vertikale Einschränkungen von oben nach unten in der Inhaltsansicht hinzufügen. Dies wird das Autolayout glücklich machen (weil er jetzt weiß, wie man die Höhe der Zelle selbst berechnet).

MonsieurDart
quelle
2
Das hat bei mir funktioniert. Ich habe alle Containerzellen durchgesehen und sichergestellt, dass mindestens eine Unteransicht sowohl eine Einschränkung "oberer Speicherplatz für Container" als auch eine Einschränkung "unterer Speicherplatz für Container" enthält.
Rog182
7
Dies ist die richtige Antwort für iOS 8, wenn Tabellenzellen mit Selbstgröße verwendet werden.
Tsafrir
1
Meinen Sie Einschränkungen von Elementen innerhalb der Inhaltsansicht bis zum oberen und unteren Rand der Inhaltsansicht?
Zack Shapiro
Ich habe es versucht, aber ich bekomme immer wieder widersprüchliche Warnungen zu Einschränkungen.
Shirish Kumar
2
Stellen Sie sicher, dass Sie der Inhaltsansicht der Zelle die obere und untere Einschränkung hinzufügen, nicht die Zelle selbst. Wenn Sie der Zelle eine Einschränkung hinzufügen, funktioniert der Code weiterhin, versucht jedoch, eine Höhe von 0 zu verwenden.
25.
26

Wenn Sie AutoLayout-Einschränkungen und UITableViewAutomaticDimension verwenden, ist dieser Fehler kein fehlerhaftes Problem, das durch Überschreiben Ihrer Höhe im Code verworfen werden muss. Dies bedeutet, dass das automatische Ermitteln der Zellenhöhe nicht funktioniert, da Sie nicht über die erforderlichen vertikalen Einschränkungen verfügen.

Wenn Sie wie ich sind und diesen Fehler erhalten haben und Hilfe benötigen, um festzustellen, welche Zelle den Fehler ausgelöst hat, können Sie die folgende Zeile unmittelbar vor der Rückgabe Ihrer Methode "heightforRowAtIndexPath" hinzufügen.

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

Dadurch wird eine lange Liste von Abschnitten und Zeilen ausgedruckt. Der Fehler wird jedoch unmittelbar nach der bestimmten Zelle angezeigt, die den Fehler verursacht, und Sie können schnell feststellen, welche Zelle das Problem verursacht, und Ihre Einschränkungen entsprechend beheben. Dies ist besonders hilfreich für statische Zellen. Das Überschreiben der Höhe mit einer manuell eingegebenen Zahl funktioniert, wenn Sie nicht AutoLayout und automatische Zellenhöhen verwenden, deaktiviert diese Funktionen jedoch im Wesentlichen. Dies ist eine sehr schlechte Lösung, wenn Sie versuchen, sie zu verwenden.

Wenn Sie zuvor nicht die Methode 'heightForRowAtIndexPath' verwendet haben, diesen Fehler jedoch debuggen möchten, ohne die Einstellung UITableViewAutomaticDimension rückgängig zu machen, fügen Sie dies einfach Ihrem Code hinzu:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}
user2898617
quelle
Vielen vielen Dank. Das hat mir sehr geholfen. Zuerst dachte ich, dieses Problem liege in einer anderen Zelle mit Tabellenansicht. Nach dem Debuggen stellte sich heraus, dass dieses Problem bei einem anderen lag.
Akozin
Ich würde das gerne tun, aber lange Abschnitte und Zeilen sind nicht identifiziert. Könnten Sie klarstellen, was diese in Swift sein sollten?
DrWhat
9

In XCode 6.1 scheint ein Fehler aufgetreten zu sein, der dieses Problem verursacht, wenn das automatische Layout verwendet wird und Sie nicht für jede Tabellenansichtszelle einen Wert für die Zeilenhöhe angeben, sondern den "Standard" -Wert beibehalten. Durch einfaches Aktivieren des Kontrollkästchens "Benutzerdefiniert" neben der Zeilenhöhe für jede Zelle wird die Warnung ausgeblendet.

ltm
quelle
2
Wenn Sie Zellen mit Selbstgröße verwenden, müssen Sie die Zeilenhöhe auf "Standard" setzen.
Phatmann
1
Dies löste die Warnung. Aber ich glaube, es erscheint nur bei Verwendung von statischen Zellen in TableView
MontiRabbit
1
@phatmann Dieses Problem tritt nur bei statischen Zellen auf, daher sollten sich die Zellen nicht selbst dimensionieren.
11.
@ltm Könnten Zellen mit Selbstgröße in statischen Zellen nicht nützlich sein, wenn der Benutzer möglicherweise Text vergrößert hat? (Sie wissen, unter Zugänglichkeit in den iPhone-Einstellungen)
Byron Coetsee
Ich denke, es ist kein Fehler. Es könnte ein Problem mit den vertikalen Einschränkungen sein. Sie müssen die Höhe der Zelle vollständig beschreiben, zumindest für Tabellenansichten mit automatischer Bemaßung.
Juanjo
3

Ja, Sie erhalten alle Einschränkungen "glücklich", auch wenn Sie nur horizontale Einschränkungen für Elemente in der Zelle der Tabellenansicht haben. Ich hatte das gleiche Problem. Sie müssen auch vertikale Einschränkungen hinzufügen. Wenn Sie dies tun, verschwindet diese Warnung.

Juraj Antas
quelle
3

Die Einschränkungen können für den Zweck des Layouts erfüllt sein, für den Zweck der automatischen Zeilenhöhe jedoch nicht. Ein fröhliches Layout würde bedeuten, dass der Inhalt ohne Mehrdeutigkeit angelegt werden kann. Das würde die Prüfungen in Interface Builder erfüllen.

Ein zufriedenstellendes Layout für die automatische Zeilenhöhe würde bedeuten, dass Sie zusätzlich zu den oben genannten auch Einschränkungen für den unteren Rand der Zelle einschließen.

Mehr hier: Es wurde ein Fall festgestellt, in dem Einschränkungen mehrdeutig eine Höhe von Null vorschlagen

Woodster
quelle
3

Ich habe die Zeilenhöhe 43 (oder <> 44) im Größeninspektor der Tabellenansicht verwendet, und der Fehler ist verschwunden. Mit 44 bekomme ich den Fehler. Xcode Version 6.0.1.

- Diese Antwort wurde von einem Moderator entfernt, bitte nicht, sie behebt das Problem. Dies löst das Problem für mich und kann es auch für andere tun. Könnten Sie so freundlich sein, es nicht wieder zu löschen?

teho
quelle
2

Ich konnte die Warnung nicht entfernen, aber damit Einschränkungen funktionieren, habe ich die neue Tabellenansichtseigenschaft für iOS8 estimatedRowHeightauf die feste Höhe festgelegt und die heightForRowAtIndexPathImplementierung entfernt .

amir
quelle
Wenn die Warnung nicht entfernt wurde, gleicht das System die fehlende Einschränkung aus und setzt die Zeilenhöhe == auf die Eigenschaft cell.rowHeight. Die Warnung bezieht sich auf eine Auto-Heal-Eigenschaft. Wenn sie automatisch geheilt wurde, bedeutet dies, dass das Problem nicht vorhanden war.
Pedro Borges
2

Wenn Sie diese Warnung erhalten, liegt dies höchstwahrscheinlich daran, dass Sie das automatische Layout verwenden und Ihre Zellen keine Einschränkungen enthalten.

Sie sollten entweder die Verwendung des automatischen Layouts beenden oder Einschränkungen implementieren, die die Höhe der Zellen eindeutig definieren.

Sie können das automatische Layout im Interface Builder deaktivieren, indem Sie die Option "Autolayout verwenden" im Dateiinspektor rechts deaktivieren.

Wenn Sie das automatische Layout verwenden und die Höhe Ihrer Zellen festgelegt ist, sollte die Implementierung der entsprechenden Einschränkungen einfach sein. Fügen Sie einfach Höhenbeschränkungen für Unteransichten der Inhaltsansicht der Zelle hinzu und implementieren Sie vertikale Platzbeschränkungen zwischen den Unteransichten sowie zwischen den Unteransichten und der Inhaltsansicht. Wenn Ihre Zelle beispielsweise eine Bezeichnung enthält, funktioniert dies:

Vertikale Einschränkungen

  1. Vertikale Platzbeschränkung zwischen dem oberen Rand der Inhaltsansicht und dem oberen Rand des Etiketts
  2. Die Höhenbeschränkung des Etiketts wurde behoben
  3. Vertikale Platzbeschränkung zwischen dem unteren Rand des Etiketts und dem unteren Rand der Inhaltsansicht

Horizontale Einschränkungen

  1. Horizontale Platzbeschränkung zwischen der Vorderkante der Inhaltsansicht und der Vorderkante des Etiketts
  2. Breitenbeschränkung des Etiketts behoben
  3. Horizontale Platzbeschränkung zwischen der Hinterkante des Etiketts und der Hinterkante der Inhaltsansicht
wrightak
quelle
Ich benutze Einschränkungen, und sie scheinen alle glücklich zu sein, wie in der Frage erwähnt.
Chris
Sind dies Einschränkungen für die Unteransichten der Inhaltsansicht der Zelle? Wie sehen Sie aus? Ist es möglich, dass Sie einige Zellen haben, die unterschiedlich sind? Wenn Sie mithilfe der Lösungen von Frederic Bonner festlegen, dass die Zellen eine feste Höhe haben, werden die Einschränkungen überschrieben.
Wrightak
1

Mit AutoLayout können Sie die richtige Höhe für Sie berechnen. Hier ist ein schöner Beitrag über Dynamic Cell Height unter iOS 8: http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/

Ricardopereira
quelle
Ich wünschte, es wäre so einfach. Das Hinzufügen dieser beiden Zeilen hat mein Problem mit der automatischen Größenanpassung leider nicht behoben
Zack Shapiro,
1

Beim Erzwingen einer Rücklaufhöhe in Swift wurde mein Problem behoben:

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)
    }
}
König-Zauberer
quelle
1

Für eine Moor-Standardkorrektur keine Einschränkungen, keine Schätzhöhen oder Überentwicklung des Problems. Ich habe ein Standardprojekt erstellt, die Tabellenansicht verkabelt, aber vergessen, den Höhendelegierten in den Ansichtscontroller einzufügen . Um diese Warnung einfach verschwinden zu lassen, benötigen Sie diese.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 44;
}

Im View Controller Ihrer Tabelle.

Latenitcodierer
quelle
1

Ich habe eine mapView in uitableviewcell verwendet. Ich habe die Höhe der Kartenansicht auf 1/3 der Bildschirmgröße des Geräts geändert. Ich habe den gleichen Fehler bekommen. Ich habe den Fehler behoben, indem ich der Inhaltsansicht der uitableviewcell fehlende Einschränkungen hinzugefügt habe.

1) Deaktivieren Sie die contentView-Einschränkungen.

2) Setzen Sie Reset auf Vorgeschlagene Konstanten für contentView.

Geben Sie hier die Bildbeschreibung ein

3) Fügen Sie fehlende Einschränkungen hinzu - falls vorhanden

4) Wir stellen sicher, dass die Inhaltsansicht alle erforderlichen Einschränkungen aufweist. Geben Sie hier die Bildbeschreibung ein

AG
quelle
0

In meinem Fall liegt es daran, dass ich die Zelle mit xib entwerfe und vergesse, diese xib-Datei zum Ziel hinzuzufügen.

Nachdem ich diese xib-Datei zum Ziel hinzugefügt habe, ist das Problem behoben

onmyway133
quelle
0

Während die Antworten auf dieser Seite, in denen das Hinzufügen von Höhenbeschränkungen oder das manuelle Zurückgeben von rowHeights wie 44 in heightForRowAtIndexPath erläutert wird, dazu führen, dass die Warnung nicht mehr angezeigt wird, sind sie überflüssig, da dies ein Fehler in Xcode ist , der in mindestens Version 6.3.2 (6D2105) sichtbar ist.

Wenn Sie in viewDidLoad einen Haltepunkt festlegen, wird self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) angezeigt, selbst wenn Sie im Storyboard eine Zeilenhöhe von 44 angeben. Dies liegt daran, dass Apple fälschlicherweise davon ausgeht, dass Sie dynamische Zeilenhöhen wünschen, wenn Sie die Zeilenhöhe bei 44 belassen, da Sie kein Flag zur Angabe Ihrer Präferenz erhalten haben.

Hier sind einige mögliche Lösungen und ihre Ergebnisse:

  • Stellen Sie die Zeilenhöhe im Storyboard auf 43 oder 45 ein (funktioniert).

  • Geben Sie manuell eine Höhe von 44 in heightForRowAtIndexPath zurück (funktioniert).

  • Fügen Sie Höhenbeschränkungen zwischen den Elementen der UITableViewCell und ihrer contentView hinzu (funktioniert).

Leider müssen Sie bei diesen Lösungen entweder Ihr Design ändern, unnötige Einschränkungen hinzufügen oder unnötigen Code hinzufügen, um einen Fehler zu umgehen. Ich habe versucht (was ich dachte) die einfachste Lösung:

  • Stellen Sie die Höhe jeder UITableViewCell im Storyboard auf 44 (Benutzerdefiniert) ein (schlägt fehl).

Ich wollte wirklich eine reine Storyboard-Lösung dafür, also habe ich endlich versucht:

  • Fügen Sie der UITableView im Storyboard ein benutzerdefiniertes Laufzeitattribut hinzu, und benennen Sie die UITableView mit einem Hinweis, wie ihre rowHeight festgelegt wird, damit zukünftige Entwickler sie finden können: (funktioniert):

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Diese Fehler sind in der iOS-Entwicklung nur allzu häufig und zwingen Entwickler dazu, übermäßig viel Zeit damit zu verbringen, die Auswirkungen abzuwägen, wie sich ihre Lösungen auf lange Sicht auf die Wartbarkeit auswirken.

Da es so schwer ist, eine konzeptionell korrekte Lösung zu finden, die wartbar ist und nicht verschleiert zu sein scheint, und davon auszugehen, dass Apple den Fehler beheben wird und 44 auf absehbare Zeit die Standardzeilenhöhe sein wird, dann die Einschränkung oder benutzerdefinierte Laufzeitattributlösungen sind wahrscheinlich am wartbarsten.

Zack Morris
quelle
0

Ich denke, hier passieren zwei wichtige Dinge.

1) Es ist super einfach, die Einschränkungen falsch zu machen, wenn Sie Strg + Ziehen drücken. Überprüfen Sie also noch einmal, ob Sie es richtig gemacht haben. Verwenden Sie am besten das Fach auf der linken Seite des Bildschirms, um diese Einschränkungen zu zeichnen.

2) Verwenden Sie die Delegate-Methode, anstatt die geschätzte Zeilenhöhe in ViewDidLoad oder an einer anderen Stelle anzugeben

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

Dies hat das Problem für mich sofort behoben.

Greg
quelle
Warum verwenden Sie Override?
FractalDoctor
0

Ich habe diesen Fehler auch bei der Verwendung von universellen Storyboards oder Xibs gesehen. Wenn Sie es versäumen, die richtigen Einschränkungen für die Größenklasse Any x Any anzugeben, wird dieser Fehler angezeigt.

Apple scheint dies für iOS9 behoben zu haben. Der Fehler ist bei mir nur auf 8.4 aufgetreten.

David Nix
quelle
0

Ich ging tagelang zwischen diesem Fehler und einem anderen Fehler hin und her, bei dem Einschränkungen erstellt wurden (keine Ahnung, wo), die mit den von mir gewünschten Einschränkungen in Konflikt standen. Ich hatte es sogar in einem Fall funktionieren lassen, in dem jede sichtbare Eigenschaft mit der anderen identisch war. Die einzige Lösung, die ich gefunden habe, war, atomar zu arbeiten - eine völlig neue Datei mit xib zu erstellen und erneut mit dem Kopieren und Einfügen des alten Codes zu beginnen. Es ist vielleicht nicht die beste Lösung, aber manchmal, wenn das Problem nicht sichtbar ist, gibt es wenig anderes zu tun. Zumindest ist Atomic ein guter Weg, um zu überprüfen, was los ist.

DrWas
quelle