6 Stimmen

Wann initialisiert ein IBOutlet?

Ich habe über den Interface Builder einen Outlet für eine Textansicht eingerichtet. Die Textansicht lädt zwar problemlos, aber ich kann nicht programmgesteuert auf Eigenschaften zugreifen, da das Outlet immer nil ist.

Wann wird es instanziiert? Auch nachdem applicationDidFinishLoading aufgerufen wurde, ist es immer noch nicht "aktiv" oder nicht entpackt.

13voto

Peter Hosey Punkte 94684

Ein Outlet wird nicht instantiiert, weil ein Outlet eine Variable (oder Eigenschaft) ist.

Die Objekte in einem Nib werden instanziiert, wenn das Nib geladen wird, und sie werden so schnell wie möglich jedem Outlet zugewiesen, nachdem die Objekte erstellt, aber vor dem Senden von awakeFromNib an alle relevanten Objekte.

Mit anderen Worten führt das Nib-Laden all dies in dieser Reihenfolge aus:

  1. Erstellt oder erstellt alle Objekte neu, die im Nib gespeichert sind. (Dies schließt File's Owner, First Responder und andere externe und imaginäre Objekte aus.)
  2. Setzt jede Outleteigenschaft, die im Nib mit dem Objekt im gleichen Nib verbunden ist, mit dem das Nib verbunden ist. (z.B.: Das view-Outlet eines Ansichtscontrollers an eine Ansicht auf oberster Ebene.)
  3. Sendet awakeFromNib an Objekte im Nib und (in Cocoa) auch an den File's Owner (z.B. Fenstercontroller).

Ihre Frage wird durch Punkt #2 beantwortet.

Der Ressourcenprogrammierleitfaden enthält weitere Informationen. Die Details sind subtil unterschiedlich zwischen Cocoa und Cocoa Touch, insbesondere hinsichtlich der Objekte, die awakeFromNib-Nachrichten erhalten und derjenigen, die es nicht tun.

Wann wird es instantiiert? Selbst nachdem meine applicationDidFinishLoading aufgerufen wird, ist es immer noch nicht "aktiv" oder deserialisiert.

Der Text-View nicht?

Es ist wahrscheinlich und Sie haben einfach das Outlet nicht verbunden. Überprüfen Sie dies im Nib.

Eine weitere Möglichkeit: Sie haben die Text-View in einem anderen Nib erstellt, nicht im Nib, in dem der App-Delegierte erstellt wird (falls Sie überhaupt den App-Delegierten in einem Nib erstellt haben), und Sie haben die Ansicht nicht mit dem Outlet des richtigen Objekts verbunden. Möglicherweise haben Sie einen zweiten App-Delegierten im Nib der Text-View erstellt; dieser App-Delegierte ist tatsächlich nicht der App-Delegierte der App, weshalb der echte App-Delegierte die Text-View nicht sieht - Sie haben die Text-View dem Imitator und nicht dem echten McCoy gegeben.

2voto

wwjdm Punkte 2398

Stellen Sie sicher, dass Sie das IBoutlet mit dem richtigen Dateibesitzer verknüpft haben. Klicken Sie auf Dateibesitzer und klicken Sie auf den Identitätsinspektor, um sicherzustellen, dass der Dateibesitzer auf die richtige Datei zeigt.

  1. Klicken Sie auf das Objekt unter Interfacebuild->Objekte
  2. Stellen Sie unter Outlets sicher, dass die Eigenschaften für die IBoutlets angezeigt werden. Wenn sie nicht angezeigt werden, könnte der Dateibesitzer falsch sein.
  3. Verknüpfen Sie die Outlets mit den Objekten - Klicken Sie auf die Linie und ziehen Sie sie zum Objekt

Die IBoutlets sollten erstellt werden, wenn der Ansichtscontroller - auch bekannt als Dateibesitzer -, der die IBoutlets in der .h-Datei enthält, initialisiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X