Swift: Subklasse von UITextView oder UICollectionView und korrekte Initialisierung

8

Das Problem mit der Unterklasse von UITextView (und UICollectionView) ist, dass der designierte Konstruktor "initWithFrame" ist. Aber im wirklichen Leben, wenn es vom Storyboard geladen wird, wird initWithCoder aufgerufen.

%Vor%

Als Ergebnis kann ich keinen Benutzeroberflächenanpassungscode bei der Initialisierung aufrufen und einen Initialisierungswert für Swift-Variablen außer den Standardwerten angeben.

Ich nehme an, dass dieses Problem vorübergehend gelöst werden kann, indem man die Rahmengröße aus dem "Coder" extrahiert, aber ich habe den Schlüssel dafür nicht gefunden.

Irgendwelche Ideen besser als Hardcode Rahmenwerte?

    
Alexey Suvorov 29.06.2014, 14:38
quelle

2 Antworten

12

(Von meinen obigen Kommentaren:) Das sieht wie ein Swift Bug aus. initWithCoder: wird wann aufgerufen Eine Ansicht (oder View-Controller) wird aus einer Storyboard- oder Nib-Datei instanziiert und überschrieben Diese Methode funktioniert in Objective-C:

%Vor%

Aber der entsprechende Swift-Code

%Vor%

schlägt mit der Fehlermeldung fehl "muss einen designierten Initialisierer der Oberklasse 'UITextView' aufrufen".

Dieses Problem tritt bei allen Unterklassen von UIView mit a auf ihr eigener designierter Initialisierer (z. B. UITextView , UICollectionView ). Auf der anderen Seite tritt das Problem nicht bei Unterklassen von UILabel auf hat keinen designierten Initialisierer. Die Swift-Sprache ist sehr streng darauf, den benannten Initialisierer der Superklassen aufzurufen, aber es sollte eine Möglichkeit geben, initWithCoder: für alle benutzerdefinierten UIView -Unterklassen zu überschreiben, also halte ich dies für einen Swift-Fehler.

Um dieses Problem zu umgehen, können Sie die benutzerdefinierte Initialisierung in

vornehmen %Vor%

Update für Swift 1.2: Dies wurde anscheinend behoben. Der Parameter geändert, ist es nicht mehr implizit optional optional. Also das kompiliert und funktioniert wie erwartet (getestet mit Xcode 6.4):

%Vor%

Update für Swift 2 (Xcode 7): init(coder:) ist nicht verfügbar Initialisierer jetzt:

%Vor%     
Martin R 29.06.2014, 16:53
quelle
0

Eine umfassendere Antwort für Swift 3:

%Vor%     
user3561494 27.09.2017 16:37
quelle

Tags und Links