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?
(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:
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:
Tags und Links ios uitextview swift uiview