Ich habe eine Klasse namens, MyClass
die eine Unterklasse von ist UIView
, die ich mit einer XIB
Datei initialisieren möchte . Ich bin nicht sicher, wie ich diese Klasse mit der aufgerufenen xib-Datei initialisieren sollView.xib
class MyClass: UIView {
// what should I do here?
//init(coder aDecoder: NSCoder) {} ??
}
Antworten:
Ich habe diesen Code getestet und er funktioniert hervorragend:
Initialisieren Sie die Ansicht und verwenden Sie sie wie folgt:
ODER
UPDATE Swift> = 3.x & Swift> = 4.x.
quelle
var view = MyClass.instanceFromNib()
&self.view.addSubview(view)
im Gegensatz zuvar view = MyClass.instanceFromNib
& seinself.view.addSubview(view())
. Nur ein kleiner Vorschlag, um die Antwort zu verbessern :)Sams Lösung ist bereits großartig, obwohl sie keine unterschiedlichen Bundles berücksichtigt (NSBundle: forClass hilft) und erfordert manuelles Laden, auch bekannt als Tippcode.
Wenn Sie volle Unterstützung für Ihre Xib-Outlets, verschiedene Bundles (Verwendung in Frameworks!) Und eine schöne Vorschau im Storyboard erhalten möchten, versuchen Sie Folgendes:
Verwenden Sie Ihre xib wie gewohnt, dh verbinden Sie Outlets mit File Owner und setzen Sie File File Owner auf Ihre eigene Klasse.
Verwendung: Unterklassen Sie einfach Ihre eigene View-Klasse in NibLoadingView und setzen Sie den Klassennamen in der Xib-Datei auf File's Owner
Kein zusätzlicher Code mehr erforderlich.
Gutschriften, bei denen Gutschriften fällig sind: Mit geringfügigen Änderungen von DenHeadless auf GH. Mein Kern: https://gist.github.com/winkelsdorf/16c481f274134718946328b6e2c9a4d8
quelle
nibSetup
voninit?(coder:)
führt beim EinbettenNibLoadingView
in eine XIB zu einer unendlichen Rekursion ..clearColor()
- nach dem Laden aus dem Storyboard. Aber es sollte funktionieren, wenn Sie es nach der Instanziierung per Code tun. Wie gesagt, ein noch eleganterer Ansatz ist der protokollbasierte. Hier ist also ein Link für Sie: github.com/AliSoftware/Reusable . Ich verwende jetzt einen ähnlichen Ansatz in Bezug auf die UITableViewCells (die ich implementiert habe, bevor ich dieses wirklich nützliche Projekt entdeckt habe). hth!Ab Swift 2.0 können Sie eine Protokollerweiterung hinzufügen. Meiner Meinung nach ist dies ein besserer Ansatz, da der Rückgabetyp
Self
eher als istUIView
und der Aufrufer nicht in die Ansichtsklasse umwandeln muss.quelle
var myView = nib.instantiate... as! myViewType
Swift 3
(XCode 8.0 Beta 6) ohne Probleme geöffnet und getestet hatte. Der Tippfehler war inSwift 2
. Warum sollte es eine andere Antwort sein, wenn diese Antwort gut ist und Benutzer wahrscheinlich gerne suchen, was die Änderungen sind, wenn sie XC8 verwendenUnd das ist die Antwort von Frederik auf Swift 3.0
quelle
Universelle Methode zum Laden der Ansicht von xib:
Beispiel:
Implementierung:
quelle
Swift 3 Antwort: In meinem Fall wollte ich eine Steckdose in meiner benutzerdefinierten Klasse haben, die ich ändern kann:
Stellen Sie in der .xib sicher, dass das Feld Benutzerdefinierte Klasse MyClassView ist. Kümmere dich nicht um den Besitzer der Datei.
Stellen Sie außerdem sicher, dass Sie die Steckdose in MyClassView mit dem Etikett verbinden:
Um es zu instanziieren:
quelle
Swift 4
In meinem Fall muss ich hier Daten an diese benutzerdefinierte Ansicht übergeben, damit ich eine statische Funktion zum Instanziieren der Ansicht erstelle.
Erstellen Sie eine UIView-Erweiterung
Erstellen Sie MyCustomView
Setzen Sie die benutzerdefinierte Klasse in der XIB-Datei auf MyCustomView. Schließen Sie die Steckdose bei Bedarf wie gewohnt an.
Sofortansicht
quelle
quelle