2009-05-07 11 views
3

Ich hatte eine schöne UIScrollView in meiner Feder, die gut funktionierte. Dann hatte ich einige sehr spezielle Bedürfnisse und unterklassifizierte UIScrollView. In meinem Nib habe ich die Klasse im Identity Inspector in meine Unterklasse geändert.Wie kann ich meinen Nib richtig laden meine benutzerdefinierte UIScrollView-Unterklasse?

Aber aus irgendeinem Grund wird meine -initWithFrame: -Methode nie aufgerufen, wenn der Nib Loader all diese Objekte aus der Nib aufbaut. Eigentlich habe ich gerade nichts in meiner Unterklasse geändert. Und die Bildlaufansicht funktioniert einfach. Erwarte, dass es ein leerer UIScrollView zu sein scheint, auch wenn ich der Nib sagte, dass es eine SpecializedUIScrollView für Testzwecke sein sollte.

Gibt es noch etwas anderes, das ich berücksichtigen muss, wenn ich ein UIScrollView-Subclassing abschließe, während ich immer noch eine Nib-Datei verwende, um es in die richtige Perspektive zu bringen?

Mein gewidmet initializer sieht wie folgt aus:

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     NSLog(@"Hello !!!!!!!!!!!!!"); 
    } 
    return self; 
} 

Ich sehe nie Hallo in der Konsole, wenn ich versuche, dass aus der Nib zu laden. Natürlich funktioniert es, wenn ich es selbst verteile und initialisiere. Aber ich möchte meine Bildlaufansicht nicht programmatisch positionieren, wenn ich stattdessen diesen verdammt coolen Interface Builder verwenden kann.

Antwort

3

Objekte in einer Nib oder Xib werden als serialisierte Objekte gespeichert. Dies kann bedeuten, dass Sie die Methode awakeFromNib verwenden müssen, da die Init-Methoden nie aufgerufen werden.

+0

Das hat funktioniert! Vielen Dank! – Thanks

1

Erweitern Sie initWithCoder, achten Sie darauf, die Super-Methode aufzurufen. Es ist während dieses Superanrufs, dass setFrame in Ihrer Klasse aufgerufen wird.

Sie können dann wieder benutzen, um Ihren Standard initWithFrame Anruf in initWithCoder und die Interface Builder wird die Rahmengröße steuern.

- (id)initWithCoder:(NSCoder *)aDecoder { 
    [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method. 
    return [self initWithFrame:[self frame]]; 
}