Init-Methode von UIView in swift überschreiben

7
%Vor%

Ich habe eine Klasse, in der der Benutzer eine benutzerdefinierte Ansicht initialisieren soll, indem er Eigenschaften wie folgt angibt:

%Vor%

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

%Vor%

Damit bekomme ich jedoch diesen Fehler:

  

Muss einen designierten Initializer der Superklasse UIView

aufrufen
    
tktsubota 19.02.2016, 03:48
quelle

3 Antworten

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 designierten Initialisierer sind, sind sie Initialisierer, die irgendwann von der Unterklasse aufgerufen werden müssen. Aus der Dokumentation:

  

Gekennzeichnete Initialisierer sind die primären Initialisierer für eine Klasse. Ein designierter Initialisierer initialisiert alle von dieser Klasse eingeführten Eigenschaften vollständig und ruft einen geeigneten Superklasseninitialisierer auf, um den Initialisierungsprozess bis zur Superklassenkette fortzusetzen.

In diesem Fall ist der angegebene Initialisierer für UIView init(frame: CGRect) , was bedeutet, dass Ihr neuer Initialisierer init(subviewColor: UIColor, subViewMessage: String zu einem bestimmten Zeitpunkt super.init(frame:) aufrufen muss.

Um das zu beheben, nehmen Sie folgende Änderungen vor:

%Vor%

ODER Sie können Ihren anderen Initialisierer in Ihrer Klasse aufrufen, der schließlich den designierten Initialisierer aufruft.

%Vor%

Wie für die Bequemlichkeitsmethode mit einfach CustomLoadingView() , müssen Sie einen anderen Initialisierer dafür hinzufügen. Fügen Sie diesen Code Ihrer benutzerdefinierten Ansicht hinzu:

%Vor%

Wenn Sie mehr über designed und convenience-Initialisierer erfahren möchten, lesen Sie hier und hier .

    
tktsubota 19.02.2016, 04:21
quelle
4

Versuchen Sie Folgendes:

%Vor%     
TechBee 19.02.2016 04:12
quelle
0

Sie müssen zu einem bestimmten Zeitpunkt in Ihrem benutzerdefinierten Initialisierer einen der UIView-Initialisierer aufrufen, zum Beispiel: super.init(frame: frameX) . Ihr Aufruf von super.init() erfüllt diese Anforderung nicht.

    
sakurasunris3 19.02.2016 04:15
quelle

Tags und Links