2016-02-19 14 views
7
class CustomView: UIView { 

    var subViewColor:UIColor 
    var subViewMessage:String 

    override init(frame:CGRect) { 
     super.init(frame:frame) 
    } 

    init(subViewColor:UIColor,subViewMessage:String){ 

     self.subViewColor = subViewColor 
     self.subViewMessage = subViewMessage 
     super.init() 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

habe ich eine Klasse, wo ich möchte der Benutzer entweder eine benutzerdefinierte Ansicht initialisieren, indem Sie Eigenschaften wie die Aufgabe:Aufschalten init-Methode von UIView in schnellen

let myView = CustomLoadingView(initialize properties here) 

Wenn der Benutzer nicht will, ihre eigenen initialisieren Eigenschaften, möchte ich CustomLoadingView mit den Standardeigenschaften ...

let myView = CustomLoadingView() // this should initialize using default value 

jedoch damit initialisieren, erhalte ich diese Fehlermeldung:

Must call a designated intializer of the superclass UIView

Antwort

26

In init(subviewColor: UIColor, subViewMessage: String) rufen Sie nicht den designierten Initialisierer auf (wie der Compiler schön hervorhebt).

Wenn Sie nicht wissen, welche designed Initialisierer sind, sind sie Initialisierer, die haben, um von der Unterklasse irgendwann aufgerufen werden. Aus der Dokumentation:

Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain.

In diesem Fall wird die bezeichnete Initialisierer für UIView ist init(frame: CGRect), an einem gewissen Punkt bedeutet, Ihr neues initializer init(subviewColor: UIColor, subViewMessage: String muss super.init(frame:) nennen.

Um dies zu beheben, die folgenden Änderungen:

init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){ 

    self.subViewColor = subViewColor 
    self.subViewMessage = subViewMessage 
    super.init(frame: frame) 

} 

oder Sie können Ihre anderen initializer in Ihrer Klasse nennen, die die benannten Initialisierer Aufruf endet.

override init(frame: CGRect) { 
    super.init(frame: frame) // calls designated initializer 
} 

convenience init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){ 

    self.subViewColor = subViewColor 
    self.subViewMessage = subViewMessage 
    self.init(frame: frame) // calls the initializer above 

} 

Wie für die bequeme Methode mit einfach CustomLoadingView(), müssen Sie eine andere Initialisierer für das hinzufügen. Fügen Sie diesen Code in Ihre benutzerdefinierte Ansicht:

convenience init() { 
    self.init(frame: DEFAULT_FRAME, subViewColor: DEFAULT_COLOR, subViewMessage: DEFAULT_MESSAGE) 
} 

Wenn Sie mehr über bezeichnet und Bequemlichkeit initializers lernen, lesen Sie über sie here und here.

+0

Das funktioniert nur für mich, wenn ich 'self.init (frame: frame)' als erstes in der 'comfort init' anrufe Methode – Joseph

4

Try this:

class CustomView: UIView { 

    var subViewColor:UIColor 
    var subViewMessage:String 

    init(subViewColor:UIColor,subViewMessage:String){ 

     self.subViewColor = subViewColor 
     self.subViewMessage = subViewMessage 

     let frame = self.frame 
     //Or you can use custom frame. 

     super.init(frame: frame) 

    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 
+2

Erzeugt einen Compilerfehler: _'self 'verwendet vor super.init call_. [Siehe diese Antwort.] (Https://stackoverflow.com/a/33765813/629407) – dxb

0

Sie müssen eine der beispielsweise an einem bestimmten Punkt in Ihrem benutzerdefinierten initializer, UIView designierter initializers nennen: super.init(frame: frameX). Ihr Anruf von super.init() erfüllt diese Anforderung nicht.