Verwenden von Swift 1.1 und Xcode 6.2.
Ich habe ein UIStoryboard mit einer einzelnen benutzerdefinierten UIViewController
Unterklasse. Darauf habe ich eine @IBOutlet
Verbindung vom Typ UIView
von diesem Controller zu einer UIView
Unterklasse im Storyboard. Ich habe auch ähnliche Verkaufsstellen für Unteransichten dieser Ansicht. Siehe Abbildung A.
Zur Laufzeit sind diese Eigenschaften jedoch gleich Null (Abbildung B). Obwohl ich versichert habe, dass ich die Steckdosen in Interface Builder angeschlossen habe.
Gedanken :
- Ist es möglich, dass etwas die Initialisierung durcheinander bringt, weil ich eine Unterklasse einer Unterklasse verwende? Ich überschreibe keine Initialisierer
awakeFromNib:
wird aus irgendeinem Grund nicht angerufen- Möglicherweise wird keine Verbindung zu Unteransichten in Unteransichten hergestellt
Dinge, die ich versucht habe:
@IBOutlet
Genau passende und Storyboard-Elementtypen (anstelle vonUIView
)- Löschen von Eigentum und Steckdose und erneutes Hinzufügen
Abbildung A *
Abbildung B.
* Der verdeckte Code in Figure A
ist:
@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!
Danke dir.
clearView
Ich erwarte, Null zu sein. Es ist etwas, das ich noch nicht umgestaltet habe. Siehe auch die Fußnote zu Abbildung A. @ShaanSingh Es sollte sein! weil Verbindungen von Storyboards zur Laufzeit festgelegt werden (sollen) und nicht Null sein sollten.let vc = UIStoryboard(name: "LocationPickerModal", bundle: nil) .instantiateViewControllerWithIdentifier("LocationPickerModalViewController") as LocationPickerModalViewController
Antworten:
Dies geschieht normalerweise, weil Ihr Ansichts-Controller seine Ansichtshierarchie noch nicht geladen hat. Ein Ansichts-Controller lädt seine Ansichtshierarchie nur, wenn ihm etwas die
view
Nachricht sendet . Das System tut dies, wenn es Zeit ist, die Ansichtshierarchie tatsächlich auf dem Bildschirm anzuzeigen, was geschieht, nachdem Dinge wieprepareForSegue:sender:
undviewWillAppear:
zurückgekehrt sind.Da Ihr VC seine Ansichtshierarchie noch nicht geladen hat, sind Ihre Outlets immer noch gleich Null.
Sie können den VC zwingen, seine Ansichtshierarchie zu laden, indem Sie sagen
_ = self.view
.quelle
viewWillAppear:
aufgerufen wird, wenn ich zum ersten Mal etwas mit dieser Steckdose mache. Der Zugriff auf die Ansicht bringt mir nichts. Immer noch null.UIViewcontroller.loadViewIfNeeded()
ist die richtige Methode, um hier zu verwenden.Haben Sie versucht, Produkt> Reinigen auszuführen? Ein sehr ähnliches Problem für mich gelöst.
quelle
DerivedData
Ordner für das Projekt gelöscht hatte .Haben Sie Ihren View Controller über ein Storyboard oder eine NIB instanziiert oder direkt über einen Initialisierer instanziiert?
Wenn Sie Ihre Klasse direkt mit dem Initialisierer instanziiert haben, werden die Steckdosen nicht verbunden. Der Interface Builder erstellt benutzerdefinierte Instanzen Ihrer Klassen und codiert diese Instanzen zur wiederholten Dekodierung in NIBs und Storyboards. Die Klassen selbst werden nicht definiert. Wenn dies Ihr Problem war, müssen Sie nur den Code ändern, in dem Sie Ihren Controller erstellen, um stattdessen die Methoden auf UIStoryboard oder UINib zu verwenden.
quelle
UIStoryboard
Instanz und rufeinstantiateViewControllerWithIdentifier
sie auf.Das Storyboard erkannte keine weiteren UI-Dinge, die ich hinzugefügt hatte. Zur Laufzeit waren alle Referenzen gleich Null. Also habe ich meinen abgeleiteten Datenordner gelöscht und dann haben diese Verbindungen wieder funktioniert.
quelle
viewDidLoad()
allen Fällen Verbindungen hergestellt, inviewWillAppear()
fast allen jedochnil
(manchmal waren noch ein oder zwei verbunden). Ich habe alles versucht und schließlich den abgeleiteten Datenordner gelöscht, neu erstellt und alles war gut.Dies geschah mir mit meiner benutzerdefinierten Sammlungsansichtszelle. Es stellte sich heraus, dass ich meine registerClassforReuseIdentifier-Methode durch registerNib ersetzen musste. Das hat es für mich behoben.
quelle
Dies geschah für mich, weil ich versehentlich meinen View Controller direkt instanziiert habe, anstatt ihn über das Storyboard zu instanziieren. Wenn Sie direkt über instanziieren, werden
MyViewController()
die Steckdosen nicht angeschlossen.quelle
In meinem Fall ist dies passiert, weil ich die
loadView
Methode in meiner ViewController-Unterklasse überschrieben, aber vergessen habe, sie hinzuzufügen[super loadView]
Wenn Sie die überschreiben
loadView
Methode , liegt es in Ihrer Verantwortung, Ihre Unteransichten zu initiieren. Da Sie es überschreiben, können die Ansichten des Interface Builder nicht in Kakaoobjekte konvertiert werden, sodass die Ausgänge gleich Null bleiben.Wenn Sie loadView in Ihrer View Controller-Unterklasse implementieren, liegt es in Ihrer Verantwortung, die UI-Elemente aus Storyboard / xib in Code zu laden.
Oder einfach anrufen
Damit die Superklasse die Möglichkeit bekommt, Storyboard / xib in Code zu laden.
quelle
Sie können
controller.view
erzwingen, um das Laden der Ansicht zum Initialisieren der IBOutlets zu erzwingen. Anschließend können Sie die Werte zuweisen.quelle
Wenn Sie
view controller
programmgesteuert durch instanziieren . Versuchen Sie dann, es wie unten zu erstellenstatt direkt
Das hat bei mir funktioniert.
quelle
Für mich trat dies auf, als ich versehentlich die Klasse meines View Controllers als deklarierte
(dh als
UINavigationController
nicht aUIViewController
).Xcode nicht abholen auf diesem Fehler auf, die Klasse zu bauen fein scheint, und überschreiben Funktionen wie
viewDidLoad
,viewWillAppear
usw. alle korrekt funktionieren. Aber keiner von denIBOutlet
s wird verbunden.Ändern der Deklaration in
reparierte es vollständig.
quelle
Ich bin kürzlich auf dieses Problem gestoßen! Hier ist mein Gedanke. Das Problem betrifft nicht Ihr Storyboard oder ein Linkproblem. Es geht darum, wie Sie Ihren ViewController initiieren. Besonders wenn Sie Swift verwenden. (Beim Erstellen einer Klassendatei befindet sich kaum etwas im Editor.)
Durch die einfache Verwendung der
init()
from super class kann nichts initiiert werden, was Sie mit Storyboard gearbeitet haben. Sie müssen also die Initialisierung des ViewControllers ändern. Ersetzenlet XXViewController = XXViewController()
durchlet XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController
Dies weist das Programm an, zum Storyboard zu gehen, um XXViewController zu finden, und initiiert allesIBOutlet
in Ihrem Storyboard.Hoffe diese Hilfe ~ GL
quelle
2019, EINE MÖGLICHKEIT FÜR DIESES SCHRECKLICHE PROBLEM:
Angenommen, Sie haben möglicherweise eine Containeransicht, die eine Art Uhr anzeigt. Also hast du
Klassenuhr: UIViewController
Sie verwenden es tatsächlich an mehreren Stellen in der App .
Auf dem Hauptbildschirm, auf dem Detailbildschirm, auf dem Bearbeitungsbildschirm.
Sie haben eine komplizierte Snapchat-ähnliche moderne App.
In der Tat
Clock
werden kann tatsächlich geladen mehr als einmal in der gleichen Zeit irgendwo auf dem gleichen Bildschirm . (Vielleicht ist es in einigen Fällen versteckt.)Sie beginnen mit der Arbeit an einer Instanz
Clock
eines Ihrer vielen Storyboards.Auf diesem Storyboard fügen Sie ein Label hinzu, NewLabel.
Natürlich fügen Sie die Steckdose im Code hinzu. Alles sollte funktionieren. Alle anderen Steckdosen funktionieren einwandfrei.
Sie haben die Steckdose definitiv verbunden.
Aber die App stürzt mit NewLabel als Null ab.
Xcode sagt Ihnen deutlich, dass Sie vergessen haben, die Steckdose anzuschließen.
Der Grund dafür ist, dass Sie "NewLabel" nur für eine der Storyboard-Anwendungen von Clock haben!
Der Absturz ist tatsächlich von >>> einem anderen Ort <<<<, an dem Sie Clock verwenden !!!!
Xcode sagt Ihnen nicht , dass der Absturz von einem anderen Ort stammt, nicht von Ihrem Arbeitsplatz aus!
Der Absturz ist eigentlich nicht von dem Ort, an dem Sie arbeiten - es ist von einem anderen Storyboard, wo sich kein "NewLabel" -Element auf diesem Storyboard befindet !!!
Frustrierend.
quelle
Für Swift 3.
quelle
Sie müssen zuerst die Ansichtshierarchie laden, um die Ausgänge im Storyboard zu instanziieren. Dazu können Sie die Methoden loadView oder loadViewIfNeeded manuell aufrufen.
quelle
In meinem Fall stürzte die App plötzlich ab. Das Debuggen ergab, dass sich alle Verkaufsstellen
nil
zum Zeitpunkt von noch befandenviewDidLoad()
.Meine App verwendet immer noch Schreibfedern für die meisten View-Controller (keine Storyboards). Alles war vorhanden, alle Steckdosen richtig verdrahtet. Ich habe es noch einmal überprüft.
Wir instanziieren unsere View Controller normalerweise als
... was aus irgendeinem Grund zu funktionieren scheint, solange die .xib den gleichen Namen wie die View-Controller-Klasse hat (ich bin mir jedoch nicht sicher, wie das funktioniert. Wir rufen nicht
init(nibName:bundle:)
mit null Argumenten auf oder überschreiben diesinit()
, um es so weiter zuself
machen wird normalerweise vorgeschlagen ...).Also habe ich versucht explizit anzurufen
... nur um mit dem Laufzeitausnahmefehler begrüßt zu werden:
Und dann habe ich es gesehen:
Das Kontrollkästchen "Zielmitgliedschaft" der .xib-Datei wurde deaktiviert.
Muss bei der Lösung eines der häufigen Zusammenführungskonflikte in Bezug auf die Xcode-Projektdatei aufgetreten sein.
Apple muss auf jeden Fall ein Projektdateiformat entwickeln, das SCM-freundlicher ist.
quelle
100% funktionierende Lösung zum Erstellen von ViewControllern aus XIB ohne StoryBoards
7.1.
7.2.
7.3.
quelle
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
Schritt 7.2 auchself
direkt in der CustomViewController-Klasse überschreiben und aufrufen .Überprüfen Sie Ihre IBOutlet-Verbindung, wenn sie mit dem Dateieigentümer oder der Ansicht verbunden ist. Es könnte Fehler geben.
quelle
Anderer Fall:
Ihre Steckdosen werden erst festgelegt, wenn die Ansicht des View Controllers tatsächlich instanziiert wurde. Dies geschieht in Ihrem Fall wahrscheinlich kurz nach initWithNibName: bundle: - zu diesem Zeitpunkt sind sie noch gleich Null. Alle Einstellungen, die Sie an diesen Ausgängen vornehmen, sollten in der -viewDidLoad-Methode Ihres View Controllers erfolgen.
quelle
Ich hatte den gleichen Fehler in einem lokalisierten Storyboard, ein Element wurde in einem Gebietsschema hinzugefügt und nicht in dem anderen. Daher hatte ich beim Umschalten auf das Gebietsschema für fehlende Elemente eine Nullreferenz für dieses Element, für die ich die (redundante) Lokalisierung entfernen musste das Storyboard unter https://stackoverflow.com/a/42256341/1356559 .
quelle
Für mich stürzte das ab, weil
containerView
es gleich Null war.Hier ist mein Code mit Crash .
Das fehlende Ding rief das an
super.loadView()
. Das Hinzufügen löste das Problem für mich.Fester Code :
quelle
Ich hatte ein ähnliches Problem, als ich zuvor das Register (_: forCellReuseIdentifier :) für die benutzerdefinierte Zelle hinzugefügt hatte, nachdem ich den Bezeichner bereits im Storyboard definiert hatte. Hatte diesen Code in der viewDidLoad () Funktion. Sobald ich es entfernt habe, hat es gut funktioniert.
quelle
Ein weiterer Fall, auf den ich gerade gestoßen bin. Ich habe den Namen meiner Klasse für den UIViewController geändert, aber vergessen, den Namen der .xib-Datei zu ändern, in der die Schnittstelle erstellt wurde.
Nachdem ich das verstanden und die Dateinamen den Klassennamen wiedergegeben hatte, war alles gut!
Ich hoffe das hilft jemandem.
quelle
Habe noch einen ...
Wenn Sie eine benutzerdefinierte Klasse für eine UITableViewCell haben, aber vergessen, Custom im Stil der Zelle anzugeben.
quelle
Sie können überprüfen, ob die is-Ansicht geladen ist.
quelle
.h
und zeigen Sie die.m
Controller-Dateien anquelle
Aus Versehen habe ich meinen View Controller mit
AVPlayerViewController
statt klassifiziertUIViewController
. Indem Sie esUIViewController
wieder normal spielen. Das sollte helfen.quelle
Ich hatte das gleiche Problem, nachdem ich eine Klasse (mit einem xib verknüpft) kopiert hatte, um sie mit einer anderen Viewcontroller-Klasse (mit einem Storyboard verknüpft) wiederzuverwenden. Ich habe vergessen zu entfernen
und
Methoden.
Nachdem ich sie entfernt hatte, begannen meine Steckdosen zu arbeiten.
quelle
Ich sehe dich benutzen
ViewController
!? inViewController
Klasse Sie müssen verwenden-viewDidLoad
, nicht-awakeFromNib
,-awakeFromNib
verwenden fürUIView
Klassequelle
Überprüfen Sie, ob fehlende oder nicht angeschlossene Steckdosen vorhanden sind.
quelle
Wenn Sie zwei haben
main.storyboards
und Änderungen an der falschen vornehmen, kann dies passieren. Dies kann immer dann passieren, wenn Sie eine Steckdose von einem unbegründeten Gerät aus anschließenstoryboard
.quelle