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.
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:
Dies protokolliert:
%Vor%Aber wenn Sie die Ansicht erzwingen:
%Vor%Das Protokoll ändert sich in:
%Vor%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.
Sind Sie sicher, dass die Objekte nicht nil
sind? NSAssert
oder NSParameterAssert
sind deine Freunde:
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
:
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:
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
.
Tags und Links objective-c iphone cocoa-touch