"Auto-Layout nach Ausführung von -layoutSubviews noch erforderlich" mit der UITableViewCell-Unterklasse

115

Mit XCode 4.5 und iOS 6 entwickle ich eine App mit einer einfachen Tabellenansicht mit benutzerdefinierten Zellen. Ich habe dies hundertmal in iOS 5 und darunter getan, aber aus irgendeinem Grund bereitet mir das neue AutoLayout-System große Probleme.

Ich habe meine Tabellenansicht und meine Prototypzelle in IB eingerichtet, Unteransichten hinzugefügt und sie als IBOutlets verkabelt. Dann habe ich meinen Delegaten und meine Datenquelle eingerichtet. Wenn jetzt jedoch die erste Zelle abgerufen cellForRowAtIndexPathwird, wird der folgende Fehler angezeigt:

*** Assertionsfehler in - [ShopCell layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776

*** Beenden der App aufgrund der nicht erfassten Ausnahme 'NSInternalInconsistencyException', Grund: 'Nach dem Ausführen von -layoutSubviews ist weiterhin ein automatisches Layout erforderlich. Die Implementierung von -layoutSubviews durch ShopCell muss super aufgerufen werden. '

Ich habe keine -layoutSubviews-Methode in meiner untergeordneten Zelle (ShopCell) implementiert, und selbst wenn ich dies versuche und den Superaufruf hinzufüge, da dies darauf hindeutet, erhalte ich immer noch den gleichen Fehler. Wenn ich die Unteransichten aus der Zelle in IB entferne und sie in eine Standard-UITableViewCell ändere, funktioniert alles wie erwartet, obwohl ich natürlich keine Daten in meinen Zellen habe.

Ich bin mir fast sicher, dass mir etwas Einfaches fehlt, kann aber keine Dokumentation oder Anleitungen finden, die darauf hinweisen, was ich falsch gemacht habe. Jede Hilfe wäre dankbar.

Bearbeiten: Ich habe gerade versucht, es in eine UITableViewCell in IB zu ändern und alle Unteransichten beizubehalten, immer noch der gleiche Fehler.

Mike Mayo
quelle
Versuchen Sie es lldb [[UIWindow keyWindow] _autoLayoutTrace]im Debugger-Bereich, wenn das automatische Layout verwendet wird.
A-Live
3
Verwenden Sie UIView für die benutzerdefinierte Zelle anstelle von UITableViewCell? Ich hatte das gleiche Problem. Ich hatte UIView für die benutzerdefinierte Zelle und fügte dem Unteransichten hinzu. In UITableViewCell geändert und es hat funktioniert.
Hey Mike, wie definierst du die Outlets? Sind sie Eigenschaften in Ihrer Implementierungsdatei in einer Klassenerweiterung?
Kokodude
@ A-Live Immer wenn ich versuche, diese Methode zu verwenden, wird im Debugger eine Fehlermeldung angezeigt. Ist diese Methode noch gültig? Edit: Nevermind, es ist ein Kleinbuchstabe l im Autolayout.
Borrrden
Deaktivieren Sie das Kontrollkästchen autoLayout im Inspektor, und bereinigen Sie es und führen Sie es aus. es wird sicherlich funktionieren.
Nico

Antworten:

57

Ich habe das gleiche Problem beim manuellen Hinzufügen von Einschränkungen im Code festgestellt. Im Code habe ich Folgendes getan:

{
    [self setTranslatesAutoresizingMaskIntoConstraints:YES];
    [self addSubview:someView];
    [self addSubview:someOtherView];
    [self addConstraint:...];
}

Hypothese

translatesAutoresizingMaskIntoConstraintsSoweit ich das beurteilen kann, besteht das Problem darin, dass UITableViewCell beim Deaktivieren das automatische Layout verwendet und natürlich fehlschlägt, da die zugrunde liegende Implementierung von layoutSublayersForLayernicht super aufruft . Jemand mit Hopper oder einem anderen Tool kann dies bestätigen. Da Sie IB verwenden, fragen Sie sich wahrscheinlich, warum dies ein Problem ist ... und das liegt daran, dass die Verwendung von IB automatisch translatesAutoresizingMaskIntoConstraintsAnsichten deaktiviert , denen Einschränkungen hinzugefügt werden (an ihrer Stelle werden automatisch Einschränkungen für Breite und Höhe hinzugefügt).

Lösung

Meine Lösung bestand darin, alles in die zu verschieben contentView.

{
   [self.contentView addSubview:someView];
   [self.contentView addSubview:someOtherView];
   [self.contentView addConstraint:...];
}

Ich bin nicht 100% sicher, ob dies in Interface Builder funktioniert, aber wenn Sie alles von Ihrer Zelle entfernen (vorausgesetzt, Sie haben etwas direkt darauf), sollte es funktionieren. Hoffe das hilft dir!

Malaxeur
quelle
4
Ich musste auch subview.translatesAutoresizingMaskIntoConstraints = NO'jede Unteransicht hinzufügen, die ich zur Inhaltsansicht hinzufügte.
Jay Peyer
5
Das hat bei mir funktioniert. Also, stellen Sie sicher , dass Sie Sie nicht rufen Sie self.contentView.translatesAutoresizingMaskIntoConstraints = NOfür die UITableViewCell.
Maurizio
53

Anscheinend ruft die layoutSubviews-Implementierung von UITableViewCell nicht super auf, was ein Problem mit dem automatischen Layout darstellt. Es würde mich interessieren, ob das Löschen der folgenden Kategorie in Projekte Abhilfe schafft. Es hat in einem Testprojekt geholfen.

#import <objc/runtime.h>
#import <objc/message.h>

@implementation UITableViewCell (FixUITableViewCellAutolayoutIHope)

+ (void)load
{
    Method existing = class_getInstanceMethod(self, @selector(layoutSubviews));
    Method new = class_getInstanceMethod(self, @selector(_autolayout_replacementLayoutSubviews));

    method_exchangeImplementations(existing, new);
}

- (void)_autolayout_replacementLayoutSubviews
{
    [super layoutSubviews];
    [self _autolayout_replacementLayoutSubviews]; // not recursive due to method swizzling
    [super layoutSubviews];
}

@end

Ich könnte das Problem hinzufügen, das bei der Verwendung einer Hintergrundansicht für die Tabellenzelle aufgetreten ist, da diese als Unteransicht zur Zelle hinzugefügt wird (während die meisten Unteransichten zur Inhaltsansicht der Tabellenzelle hinzugefügt werden sollten, was normalerweise besser funktionieren sollte).

Hinweis: Es scheint, dass dieser Fehler in iOS7 behoben ist. Ich konnte diesen Code entfernen oder zumindest eine Laufzeitprüfung hinzufügen, sodass dies nur unter iOS6 möglich ist.

Carl Lindberg
quelle
Das Seltsame ist, dass es mit einer einfachen UITableViewCell für mich gut funktioniert, nur nicht für eine Unterklasse ...
Borrrden
Sie würden das denken, aber alles, was ich habe, ist eine Init-Methode, sonst nichts> <. Ich habe layoutSubviews in meinem Leben nie überschrieben, haha. Ich denke, das Problem ist die benutzerdefinierte Ansicht, die UITableViewCell verwendet, da die Stammansicht das automatische Layout nicht verwenden kann, da sie layoutSubviews überschreibt (wenn Sie also versuchen, der Stammansicht Einschränkungen hinzuzufügen,
schlägt dies
6
Ich musste UITableViewaus dem gleichen Grund eine solche Kategorie erstellen (iOS 6.1 b1)
Joshua J. McKinnon
5
Gibt es eine ähnliche Lösung für TableHeaderView, da das Problem in iOS 7 weiterhin besteht?
Softlion
1
Das funktioniert super. Dieses Problem trat auf, als ich versuchte, eine UIVIew-Unteransicht in einer UITableView zu zentrieren. Auch in iOS 7 tritt die Behauptung auf. In iOS 8 tritt dies jedoch nicht auf, sodass der Fehler behoben sein muss.
Jordan H
33

Ich hatte den gleichen Fehler für einige Monate. Aber ich habe gefunden, was das Problem war.

Wenn ich eine IB-Datei erstelle, UIViewwird bereits eine hinzugefügt. Wenn Sie diese Ansicht verwenden, stürzt die App nicht ab, wenn das automatische Layout deaktiviert ist (es gibt jedoch andere Probleme). Wenn Sie das automatische Layout verwenden, müssen Sie die richtige Ansicht in der Objektbibliothek auswählen : UITableViewCell.

In der Tat sollten Sie dieses Element immer verwenden, da alle Unteransichten zu den contentViewvon hinzugefügt werden UITableViewCell.

Das ist alles. Alles wird gut.

Arnaud
quelle
Dies sollte nicht die akzeptierte Antwort sein, da es sich bei der Frage nicht um eine Implementierung mit IB handelt und dieses Problem auftreten kann, wenn Sie IB nicht verwenden. Wenn Sie Ihre Ansichten programmgesteuert machen, ist die Antwort von @ PhilLoden praktikabler.
Eric
Ich habe die Antwort nicht verstanden. kann jemand klarer erklären? danke
hasan
Ich glaube, ich habe das Recht. ist es genug, um Klasse att zu überprüfen. im Identitätsinspektor im Interface Builder? oder das, was hinzugefügt wurde, war von einem anderen Typ und einer anderen Klasse att. wurde später aktualisiert? Verursacht das auch das Problem?
Hasan
@ hasan83 Sie können die Zelle tatsächlich zurückgeben. Eine UITableViewCell ist im Grunde eine UIView mit einer Wiederverwendungskennung.
Arnaud
17

Ich hatte die gleichen Probleme mit custom UITableViewHeaderFooterView+ xib.

Ich habe hier einige Antworten gesehen, aber ich habe festgestellt, welche Implementierung -layoutSubviewsin meiner benutzerdefinierten Fußzeilenansicht das Problem behebt:

-(void)layoutSubviews
{
    [super layoutSubviews];
    [self layoutIfNeeded]; // this line is key
}
Sound Blaster
quelle
1
Beachten Sie, dass dies zu einer Endlosschleife und schließlich zu EXC_BAD_ACCESS KERN_PROTECTION_FAILURE führen kann
mbi
15

Ich habe dies als Ergebnis der Änderung von Einschränkungen bei der Implementierung von layoutSubviews gesehen. Das Problem wurde behoben, indem der Aufruf vom Anfang bis zum Ende der Methode auf Super verschoben wurde.

Phil Loden
quelle
Das hat bei mir funktioniert. Ich habe eine benutzerdefinierte UICollectionViewCell, die ich in layoutSubviews formatiere. Weiß jemand, warum diese Lösung funktioniert?
STANGMMX
@STANGMMX, die Antwort von A'sa Dickens erklärt warum.
Fábio Oliveira
15

Hatte das gleiche Problem in iOS 7 (iOS 8 scheint zu beheben). Die Lösung für mich war, [self.view layoutIfNeeded]am Ende meiner viewDidLayoutSubviewsMethode aufzurufen .

Keller
quelle
Danke dir. Es hilft mir. Ich bin gestern auf dieses Problem gestoßen (unter iOS 7). es hilft für iOS 7.
Alexander
@ MaciejSwic siehe meine Antwort oben.
Sound Blaster
Das hat bei mir funktioniert! Verwenden von iOS 7.1 mit Swift. Ich habe eine Einschränkung für viewDidLayoutSubviews entfernt und hinzugefügt. Ich habe den Superanruf entfernt und es hat immer noch nicht funktioniert, aber diese Lösung hat es geschafft! Gib diesem Dinosaurier ein Blatt! :)
Jomafer
Arbeitete auch für mich mit iOS 7.1!
fdlr
14

Ich hatte das gleiche Problem. Das Problem lag in der Art und Weise, wie ich die Zelle Xib erstellt habe. Ich habe wie gewohnt eine Xib erstellt und nur den Typ der Standard-UIView in meine benutzerdefinierte UITableViewCell-Klasse geändert. Der richtige Weg ist, zuerst die Standardansicht zu löschen und dann das Zellenobjekt der Tabellenansicht auf die xib zu ziehen. Weitere Details hier: http://allplayers.github.io/blog/2012/11/18/Custom-UITableViewCell-With-NIB/

Trunal Bhanse
quelle
1
Perfekter Einblick! Es würde ewig dauern, bis mir klar wird, dass meine Apps nicht abstürzen würden, wenn ich ein UIView mit deaktiviertem AutoLayout verwende.
Guilherme
Super! siehe auch @Arnaud Antwort unten
Lubbo
7

Ich habe das Problem behoben, indem ich "Autolayout" für alle Unteransichten meiner benutzerdefinierten Tabellenansichtszelle deaktiviert habe.

Wählen Sie in der xib für eine benutzerdefinierte Zelle eine Unteransicht aus und deaktivieren Sie Dateiinspektor> Interface Builder-Dokument> Autolayout verwenden

Johno
quelle
4
Ich tat das gleiche. Keine wirkliche Lösung, wenn Sie das Autolayout verwenden möchten
ajmccall
7

Ich hatte ein ähnliches Problem nicht an UITableViewCell, sondern an UITableViewsich. Da es das erste Ergebnis in Google ist, werde ich es hier veröffentlichen. Es stellte sich heraus, dass dies viewForHeaderInSectiondas Problem war. Ich habe ein UITableViewHeaderFooterViewund setzen translatesAutoresizingMaskIntoConstraintsaufNO . Jetzt kommt hier der interessante Teil:

iOS 7:

// don't do this on iOS 7
sectionHeader.translatesAutoresizingMaskIntoConstraints = NO;

Wenn ich das mache, stürzt die App mit ab

Nach dem Ausführen von -layoutSubviews ist weiterhin ein automatisches Layout erforderlich. Die Implementierung von -layoutSubviews durch UITableView muss super aufgerufen werden.

OK, ich dachte, Sie können das automatische Layout nicht für einen Tabellenansichts-Header und nur für die Unteransichten verwenden. Aber das ist nicht die volle Wahrheit, wie Sie später sehen. Zusammenfassend: Deaktivieren Sie unter iOS 7 nicht die automatische Größenänderungsmaske für den Header. Andernfalls funktioniert sie einwandfrei.

iOS 8:

// you have to do this, otherwise you get an auto layout error
sectionHeader.translatesAutoresizingMaskIntoConstraints = NO;

Wenn ich dies nicht verwenden würde, würde ich die folgende Ausgabe erhalten:

Einschränkungen können nicht gleichzeitig erfüllt werden.

Für iOS 8 müssen Sie die automatische Größenänderungsmaske für den Header deaktivieren.

Ich weiß nicht, warum es sich so verhält, aber es scheint, dass Apple einige Probleme in iOS 8 behoben hat und das automatische Layout unter iOS 7 und iOS 8 anders funktioniert.

testen
quelle
Kumpel, du rettest nur meinen Tag!
Marcin Małysz
5

Wie bereits erwähnt, müssen Sie beim Erstellen einer Ansicht zur Verwendung in einer UITableView die standardmäßig erstellte Ansicht löschen und eine UITableViewCell oder UITableViewHeaderFooterView als Stammansicht ziehen. Es gibt jedoch eine Möglichkeit, das XIB zu reparieren, falls Sie diesen Teil verpasst haben. Sie haben die XIB - Datei in einem Texteditor zu öffnen und in dem Root - Tag und sein direktes Kind Add / ändern das Attribut translatesAutoresizingMaskIntoConstraintszu YES, zum Beispiel

<view contentMode="scaleToFill" horizontalHuggingPriority="1000" id="1" translatesAutoresizingMaskIntoConstraints="YES" customClass="MXWCollapsibleTableHeaderView">

Maksymilian Wojakowski
quelle
2

Ich stoße darauf und es scheint, dass es mit UITableViewCell-Unterklassen als Prototypzellen zusammenhängt, denen speziell andere benutzerdefinierte UIView-Unterklassen hinzugefügt wurden. Ich betone hier den "Brauch", weil ich mit Zellen, die nur UIKit-Kinder haben, erfolgreich war, aber er fällt um, wenn ich versuche, die Einschränkungen für Ansichten zu erstellen, die ich maßgeschneidert erstellt habe, und den in der Frage des Autors angegebenen Fehler auslöst.

Ich musste meine Zellen in unabhängige Schreibfedern aufteilen, die kein AutoLayout verwenden.

Hoffen wir, dass Apple dieses Chaos beseitigt.

Lee Probert
quelle
2

Fügen Sie Ihre Unteransichten zur Inhaltsansicht der Zelle anstelle der Zelle selbst hinzu. Also statt:

[self addSubview:someView];

Sie müssen verwenden

[self.contentView addSubview:someView];

Christian Aberger
quelle
1

Ich bin auf diese gestoßen, weil ich einer xib-Datei ursprünglich eine UIView anstelle einer UITableViewCell hinzugefügt hatte.

mjmdavis
quelle
1

Ich habe diesen Fehler behoben, indem ich den backgroundViewConnector von meinem Hintergrund UIImageViewund den accessoryViewConnector von meinen UIButtonAnpassungen abgekoppelt habe. Ich vermute, dass diese nicht so verwendet werden sollten, wie ich sie verwendet habe.

Owen Godfrey
quelle
1

Ich war heute zum ersten Mal auf dieses Problem gestoßen. Bis jetzt hatte ich verschiedene Erfahrungen mit der Verwendung von UITableViewCell-Unterklassen als Prototyp, bin jedoch nie auf dieses Problem gestoßen. Was an der Zelle, mit der ich arbeitete, anders war, war, dass ich ein IBOutlet für die -backgroundView hatte, mit der ich die Zelle einfärbte. Ich stellte fest, dass diese Behauptung wegfiel, wenn ich eine neue Eigenschaft erstellte und dennoch eine neue UIView hinzufügte, die sich über die gesamte Zelle erstreckte. Um zu überprüfen, ob dies die Ursache war, habe ich diese Ansicht wieder an den backgroundView-Ausgang angehängt, und die Behauptung wurde erneut angezeigt. Bisher keine weiteren Probleme bei der Verwendung von AutoLayout in einem untergeordneten Prototyp UITableViewCell, seit ich diese Änderung vorgenommen habe.

Eric Schramm
quelle
1

Ich habe keine richtige Lösung für dieses Problem gefunden, aber Sie können es beheben, indem Sie Frames verwenden und die Eigenschaft translatesAutoresizingMaskIntoConstraints nicht auf Nein setzen (standardmäßig ist es ja, also setzen Sie es nicht).

CGRect headerViewFrame = CGRectMake(0,0,320,60); //Frame for your header/footer view
UIView *tableHeaderView = [[UIView alloc] initWithFrame:headerViewFrame];
tableHeaderView.translatesAutoresizingMaskIntoConstraints = Yes; //Or don't set it at all
[self.tableView setTableHeaderView:tableHeaderView];
Sanjana
quelle
0

Ich habe das Gleiche erlebt. Es stellte sich heraus, dass diese Ausnahme möglicherweise ausgelöst wird, wenn Sie programmgesteuert eine Unteransicht aus Ihrer ShopCell .xib / Storyboard hinzufügen, die das automatische Layout als Unteransicht zu einer anderen Ansicht verwendet. Dies hängt davon ab, wie Ihre Einschränkungen konfiguriert sind. Ich vermute, dass die in IB erstellten Einschränkungen die Probleme beim programmgesteuerten Hinzufügen einer Ansicht als Unteransicht verursachen, da dann Einschränkungen aus AnsichtA -> AnsichtB beibehalten werden, während Sie möglicherweise AnsichtB als Unteransicht von AnsichtC hinzufügen. Du hast es verstanden (dieser Satz verwirrt mich sogar)?

In meiner Situation - da es sehr einfache Ansichten waren, die das Problem verursachten - habe ich die Ansichten programmgesteuert und nicht in IB erstellt. Das hat es gelöst. Sie können diese Ansichten in andere xib-Dateien extrahieren und das automatische Layout für diese deaktivieren. Ich denke das würde funktionieren.

Kasper Munck
quelle
0

In einigen Situationen löst dies das Layoutproblem leicht (abhängig von Ihrem Layout). Legen Sie in Ihrer UITableView-Unterklasse entweder in awakeFromNib oder in init die Autoresizing-Maske fest:

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Standardmäßig ist UIViewAutoresizingNone eingestellt

Arie Litovsky
quelle
Dies löste das Problem, mit dem ich konfrontiert war. Ich verwende das automatische Layout in einer Tabellenzelle kombiniert mit [tableViewCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height, um die Höhe zu erhalten, in der ich dann verwende heightForRowAtIndexPath.
NathanAldenSr
0

In meinem Fall,

Die referenzierte UIImageView für das automatische Layout für UITableView wird der Hintergrundansicht der UITableView zugewiesen.

self.tableView.backgroundView = self.tableBackgroundImageView;

Also habe ich UIImageView für backgroundView aus der UIView (Stammansicht) entfernt und alle automatischen Layoutreferenzen auf diese UIImageView zurückgesetzt (entfernt). Ich habe diese UIImageView für den Hintergrund außerhalb der UIView (Stammansicht) platziert. Und dann der Hintergrundansicht der UITableView im Code zuweisen.

Dann behoben.

Conan Kim
quelle
0

Ich habe die Lösung gefunden.

In meinem Fall habe ich die Zellenansicht im Storyboard erstellt (mit aktiviertem automatischen Layout) und die benutzerdefinierte UITableViewCell-Schnittstelle in ViewController.m definiert. Ich muss die Schnittstelle nach ViewController.h verschieben.

Nim Thitipariwat
quelle
0

Ich habe das gleiche Problem festgestellt, als ich das Storyboard zum Erstellen der benutzerdefinierten UITableViewCell verwendet habe. Glücklicherweise habe ich das Problem gefunden, weil ich die Zubehöransicht ([UITableViewCell setAccessoryView:]) an UIButton ausgegeben habe, die ich der Zelle hinzugefügt habe.

So kam es in meinem Projekt vor, als es auf iOS6 ausgeführt wurde.

Lösung

Ich lasse den Ausgang zwischen accessoryView und meiner Schaltfläche frei, die die benutzerdefinierte Zelle enthielt.

Vorschlag

Sie sollten die nativen Elemente von UITableViewCell nicht verwenden und ändern.

Wanqiang Ji
quelle
0

Dieses Problem kann dadurch verursacht werden, dass Sie vergessen haben, [super viewDidAppear:]innerhalb anzurufen viewDidAppear, aber ich bin sicher, dass dies nicht die einzige Ursache ist.

michaelsnowden
quelle
0

Ich hatte genau das gleiche Problem. Hier ist das Problem mit meinem Projekt:
Als ich am Interface Builder gearbeitet habe, um eine benutzerdefinierte UITableViewCell zu erstellen, habe ich eine Ansicht anstelle einer Tabellenansichtszelle aus dem Objekterfassungsbereich in Xcode
als benutzerdefinierte Tabellenzelle gezogen.
Wenn Sie sich in derselben Situation befinden, ist hier die Lösung:
Löschen Sie die Ansicht im Interface Builder, ziehen Sie eine Tabellenansichtszelle aus dem Objektauflistungsbereich und wiederholen Sie die benutzerdefinierte Tabellenzellenansicht. Sie können die Objekte in der alten Ansicht kopieren und in die Zeichenfläche für die neue Tabellenansichtszelle einfügen.

us_david
quelle
0

Ich hatte ein sehr ähnliches Problem mit einer Tabellenfußansicht, die ich in Xcode 6, iOS 7+ eingestellt hatte. Die Lösung hatte das Format der NIB-Datei. Anscheinend steckte es im Xcode 4-Format oder so. Durch Ändern der Dateieinstellungen in "Wird geöffnet in: Xcode 6.0" (oder "Standard") wurde das Problem sofort behoben. Ich habe die Lösung zufällig gefunden: Es hat mich verrückt gemacht, also habe ich die gesamte Datei gelöscht und erneut erstellt, offensichtlich mit den Standardeinstellungen. Ich habe keine Ahnung, warum das einfache Bearbeiten der Datei im neuesten Xcode sie nicht in ein Xcode 5+ -Format konvertiert hat, wie es normalerweise der Fall ist.

f

user3099609
quelle
0

Ich ging hatte das gleiche Problem. Ich ging zu meinem DetailViewController und benannte den Bezeichner in UIView um. Es war zuvor auf UITableView. Es hat das Problem behoben. Dieses Problem muss nicht in Ihrem DetailViewController auftreten. Es könnte in jedem anderen sein. Versuchen Sie, es in die respektierte Kennung umzubenennen.

RandomDude
quelle
0

Ich hatte ein ähnliches Problem mit statischen Tabellenansichtszellen in IB. Eine der Zellen hatte eine Unteransicht mit einer Klasse, die fälschlicherweise in eine Unterklasse von UITextfield geändert wurde. Der Compiler hat keine Warnungen / Fehler gegeben. Zur Laufzeit konnte das System den View Controller jedoch nicht mit dem oben genannten Absturz laden.

Yannick Winters
quelle
0

Problem ist die Reihenfolge der Layoutaufrufe an die Unteransichten:

Auschecken

Wird in iOS <8 angezeigt

Shanu ji
quelle
0

Lösung: Ändern Sie die Einschränkungen, bevor Sie super layoutSubviews aufrufen

- (void)layoutSubviews
{

    [self _updateConstraints];

    [super layoutSubviews];
}
abuharsky
quelle
0

Ich habe Carl Lindbergs Antwort geändert , um sie zu überschreibenUITableView stattdessen und sie hat bei mir funktioniert:

UITableView + AutoLayoutFix.h

@interface UITableView (AutoLayoutFix)
@end

UITableView + AutoLayoutFix.m

#import <objc/runtime.h>

@implementation UITableView (AutoLayoutFix)

+ (void)load
{
    Method existingMethod = class_getInstanceMethod(self, @selector(layoutSubviews));
    Method newMethod = class_getInstanceMethod(self, @selector(_autolayout_replacementLayoutSubviews));

    method_exchangeImplementations(existingMethod, newMethod);
}

- (void)_autolayout_replacementLayoutSubviews
{
    [super layoutSubviews];
    [self _autolayout_replacementLayoutSubviews]; // not recursive due to method swizzling
    [super layoutSubviews];
}

@end

Dann habe MyViewController.mich in gerade die Kategorie importiert:

#import "UITableView+AutoLayoutFix.h"
Pflüger
quelle
0

Ich traf das gleiche Problem und fand schließlich der Grund war , dass ich ein Hindernis für die UITableViewCell hinzugefügt, was die der UITableViewCell sein sollte content . Als ich die Einschränkung änderte, ging alles gut!

Alfy
quelle