2013-02-28 17 views
13

Ich habe eine UIView auf dem Interface Builder. In meiner Ansicht Controller habe ich eine IBOutlet MyUIView, die auf die UIView auf dem Interface Builder zeigt.Subclassing einer UIView. Init-Methode wird nie

änderte ich die Klasse des UIView auf „MyUIView“ (benutzerdefinierte UIView Klasse), aber es wie keine der init Methoden der Unterklasse sind gefeuert scheint.

Was mache ich falsch?

+1

könnten Sie Ihren Code zeigen, wie Sie es tun? – nsgulliver

+0

Nichts wirklich im Code! Im Interface Builder wähle ich die UIView und setze die Klasse auf "ShadowView". Ich habe Breakpoints in die ShadowView-Init-Methode eingefügt, geht aber niemals in diese Methoden ein. –

Antwort

25

Statt init Sie müssen initWithCoder rufen zuerst rufen dann init wie:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if ((self = [super initWithCoder:aDecoder])) { 
     [self baseClassInit]; 
    } 
    return self; 
} 

- (void)baseClassInit { 

    //initialize all ivars and properties  
} 
+0

Danke, ich werde es überprüfen! –

+0

Sie müssen auch * initWithCoder: 'implementieren, wie dieser Code tut. Einfach von einem zufälligen Ort aus anzurufen, während "init" allein überschrieben wird, wird die Aufgabe nicht erfüllen. –

20

Kurze Antwort: Sie initWithCoder: verwenden müssen.

Aus dem initWithFrame: docs:

Wenn Sie Interface Builder verwenden, um Ihre Schnittstelle zu entwerfen, wird diese Methode nicht aufgerufen, wenn Ihre Ansicht Objekte anschließend aus der Nib-Datei geladen werden. Objekte in einer NIB-Datei werden wiederhergestellt und anschließend mit der Methode initWithCoder: initialisiert, die die Attribute der Ansicht so ändert, dass sie mit den in der NIB-Datei gespeicherten Attributen übereinstimmt.

Wenn Sie eine nib/xib/Storyboard-Datei verwenden, verwenden Sie initWithCoder:. Wenn Sie Ihre Ansicht programmgesteuert erstellen, können Sie init oder initWithFrame: verwenden.