Zugriff auf die Ansicht in watchFromNib?

8

Ich habe versucht, eine UIImageView Hintergrundfarbe (siehe unten) in watchFromNib

zu setzen %Vor%

Als es nicht funktionierte, erkannte ich, dass es wahrscheinlich daran lag, dass die Ansicht noch nicht geladen war und ich die Farbänderung in viewDidLoad verschieben sollte.

Kann ich nur bestätigen, dass ich das richtig gemacht habe?

Gary

EDIT_002:

Ich habe gerade ein neues Projekt gestartet, um das von Anfang an zu überprüfen. Ich habe die Ansicht wie immer eingerichtet. Die Ergebnisse sind, dass die Steuerelemente in der WakeFromNib tatsächlich auf (Null) festgelegt sind. Hier ist was ich habe:

CODE:

%Vor%

.

%Vor%

AUSGABE:

%Vor%

Es würde mich interessieren zu wissen, ob das funktionieren sollte, von den Dokumenten sieht es so aus, wie es sollte, aber angesichts der Art, wie ich die Dinge normalerweise aufstelle, kann ich nicht ganz verstehen, warum es in diesem Fall nicht geht.

    
fuzzygoat 27.04.2010, 16:31
quelle

5 Antworten

27

Noch eine Antwort :-) Es sieht so aus, als ob Sie dieses Verhalten bekommen, weil der Controller die Ansichten träge lädt. Die Ansicht wird nicht sofort geladen, sie wird geladen, wenn jemand das view Accessor zum ersten Mal aufruft. Daher wird zu dem Zeitpunkt, zu dem Sie awakeFromNib erhalten, der NIB-Ladeprozess durchgeführt, aber nicht für die Objekte in Ihren Ansichten . Siehe diesen Code:

%Vor%

Dies protokolliert:

%Vor%

Aber wenn Sie die Ansicht erzwingen:

%Vor%

Das Protokoll ändert sich in:

%Vor%     
zoul 28.04.2010, 16:49
quelle
1

Ich glaube, Ihr Aufruf an Super muss die erste Zeile der wakeFromNib-Methode sein, sonst werden die Elemente noch nicht eingerichtet.

%Vor%     
raidfive 27.04.2010 18:00
quelle
0

Ich weiß, dieser Beitrag ist etwas älter, aber ich hatte kürzlich ein ähnliches Problem und möchte seine Lösung mit Ihnen teilen.

Nachdem ich NSTextView als Unterklasse deklariert hatte, wollte ich die Zeilenfarben in abwechselnden Reihenfolgen anzeigen. Um die Farben von außen ändern zu können, habe ich meiner Unterklasse XNSStripedTableView zwei Instanzvariablen hinzugefügt:

%Vor%

Überschreiben highlightSelectionInClipRect: macht den Trick, um die richtige Farbe für den jeweiligen ClipRect zu setzen.

%Vor%

{

%Vor%

}

Das einzige Problem ist jetzt, wo die Anfangswerte für pColor und sColor gesetzt werden? Ich habe versucht, watchFromNib :, aber dies würde dazu führen, dass der Debugger mit einem Fehler auftauchen. Also habe ich das Problem mit NSLog untersucht: und eine einfache, aber praktikable Lösung gefunden: Setzen Sie die Anfangswerte in viewWillDraw: . Da die Objekte nicht beim ersten Aufruf der Methode erstellt werden, musste ich nach nil suchen.

%Vor%

}

Ich denke, dass diese Lösung ziemlich gut ist :-), obwohl man die Namen von pColor neu auswählen könnte und sColor könnte so angepasst werden, dass es "menschlicher lesbar" ist.

    
Living Skull 15.02.2012 11:09
quelle
-1

Sind Sie sicher, dass die Objekte nicht nil sind? NSAssert oder NSParameterAssert sind deine Freunde:

%Vor%

Wenn die Objekte wirklich initialisiert werden, versuchen Sie ihre Adresse zu protokollieren und stellen Sie sicher, dass die Instanzen, die in viewDidLoad erscheinen, die gleichen sind wie die in awakeFromNib :

%Vor%

Wenn die Zahlen identisch sind, können Sie eine Kategorie erstellen, um einen Haltepunkt für setBackgroundColor festzulegen, und im Stack-Trace einen Blick werfen, um zu sehen, was passiert:

%Vor%

Sie können denselben Trick mit einer benutzerdefinierten Unterklasse ausführen:

%Vor%

Nun werden Sie Ihre UIViewObject auf die Klasse PeekingView im Interface Builder setzen und Sie werden wissen, wenn jemand versucht, den Hintergrund zu setzen. Dies sollte den Fall erfassen, in dem jemand die Hintergrundänderungen nach dem Initialisieren der Ansicht in awakeFromNib überschreibt.

Aber ich nehme an, dass das Problem viel einfacher sein wird, dh. imageView ist höchstwahrscheinlich nil .

    
zoul 27.04.2010 17:48
quelle
-1

Falls Sie eine UIView-Unterklasse anstelle einer UIViewController-Unterklasse verwenden, können Sie loadView method:

überschreiben %Vor%     
lucaslt89 19.07.2016 15:49
quelle

Tags und Links