2016-10-26 6 views
0

Ich habe meine App wie unten. Ich konfiguriere einen Übergang von der ersten Szene zur zweiten, wenn der Benutzer auf die Rock-Taste klickt, mit der Rock-Methode (ohne einen Übergang). Aber wenn ich die App starte, erhalte ich den folgenden Fehler. Bitte lassen Sie mich wissen, was das Problem ist? Ist das Storyboard-Objekt, auf das sich das Label bezieht, noch nicht erstellt? enter image description hereenter image description hereIOS Storyboard-Objekte

Antwort

0

Entweder secvc oder seine label Eigenschaft sind nil. Legen Sie einen Haltepunkt für diese Zeile fest und überprüfen Sie den jeweiligen Wert, bevor diese Zeile ausgeführt wird, um zu sehen, welcher Wert nil ist.

+0

Ich bin sicher, es ist das Etikett. Ich habe eine andere Instanzeigenschaft von secviewcontroller erstellt und sie anstelle des Labels in der Rock-Methode verwendet, und es hat gut funktioniert. Ich möchte nur wissen, wann das Label-Objekt in diesem Szenario erstellt wird. – Swifty

0

Sie können den Text nicht festgelegt, weil das Etikett noch nicht erstellt, weil die Viewcontroller Sicht auf Ihre zweite ist nicht an der Zeit, Ihren Versuch so stellen Sie den Text des Etiketts

geladen wird Eine mögliche Lösung wäre, in Ihrem zweiten View-Controller

var text: String! 

hinzuzufügen. Setzen Sie diese var in Ihrer Rock-Funktion:

secvc.text = "rock ..." 

und stellen Sie den Text Ihres Etiketts später im viewDidLoad() (die Ansicht wird nun geladen und das Etikett erstellt wurde) Funktion des zweiten Viewcontroller:

label.text = text 
+0

Hey Sam danke für die Antwort. Ich habe herausgefunden, dass es das Label ist. Aber könnten Sie bitte erklären, wie die Storyboard-Objekte erstellt und instanziiert werden. Weil das label-Objekt zur Laufzeit aus der nib-Datei geladen wird, dachte ich, ich könnte die outlet-Eigenschaft verwenden, um darauf zuzugreifen. – Swifty

+0

Ich bin ein Anfänger in Swift selbst, aber wenn Sie einen ViewController instanziieren, werden die IBOutlets noch nicht erstellt, weil die Ansicht des ViewControllers noch nicht geladen ist. Es wird geladen, sobald Sie 'self.present (...)' aufrufen. – eLwoodianer

+1

Das Storyboard ist eine XML-Datei. Es wird geladen und analysiert und dann verwendet, um alle Objekte in der Storyboard zu instanziieren und sie mit den Outlets in Ihrem ViewController zu verbinden. Diese Verbindung wird erst dann garantiert, wenn viewDidLoad aufgerufen wird. Deshalb legen Sie im Quellcode-Controller eine Eigenschaft fest (Ihre Outlets sind noch nicht vorhanden), und dann in viewDidLoad (Ihre Outlets sind jetzt vorhanden) können Sie diese Eigenschaft der .text -Eigenschaft Ihres Outlets zuweisen. –

0

Ein netter generischer Ansatz besteht darin, eine NSDictionary -Eigenschaft auf einem View-Controller zu definieren und dann diese Eigenschaft einfach vom Aufrufer aus zu setzen. Dann können Sie in der viewDidLoad auf das Wörterbuch zugreifen und alle Widgetdaten aus den verschiedenen Feldern im dict ausfüllen. Dies berücksichtigt die Lebensdauer des GUI-Widgets und erleichtert Ihnen die Arbeit, da nur Daten ausgetauscht werden. Übermitteln Sie auf diese Weise keine Refs an irgendwelche UI * -Objekte, und vermeiden Sie, sich mit Ref-Count-Loops in den Fuß zu schießen.

+0

Genauer gesagt würde ich eine Instanz einer Klasse/eines Modells an den anderen View-Controller anstelle eines Wörterbuchs übergeben. VIEL besser lesbar. – AdamPro13

+0

Nun, sicher, ein komplettes Modellobjekt ist besser, aber es dauert auch länger, die erste Revision des Codes zu machen. Ein Wörterbuch ist mindestens besser als bestimmte Felder im View-Controller zu setzen, die noch nicht einmal vollständig aufgebaut sind. – MoDJ