Programmgesteuertes hinzufügen von benutzerdefinierten Ansicht zu einer anderen Ansicht
Habe ich erstellt eine benutzerdefinierte Ansicht mit ein .xib-Datei für das layout. Ich möchte ein Programm erstellen, und fügen Sie diese Ansicht als eine Untersicht auf eine andere Ansicht.
Untersicht Klasse:
class Subview: UIView {
@IBOutlet var view: UIView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var textLabel: UILabel!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
Bundle.main.loadNibNamed("Subview", owner: self, options: nil)
self.addSubview(view)
view.frame = self.bounds
}
}
Ich bin mir nicht sicher wie Sie gehen über es, ist die einzige Konstruktor erwartet zurzeit eine Instanz von NSCoder, die ich nicht habe.
Ich habe versucht, um ihm eine zusätzliche initialiser:
init(title: String, text: String) {
titleLabel.text = title
textLabel.text = text
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
}
Und dann rufen Sie:
let v = Subview(title: dataSource[i].whatever, text: dataSource[i].bla)
Aber es schlägt fehl, wenn Sie versuchen, ändern Sie die label-Verkaufsstellen, die Sinn macht, als die .xib noch nicht initialisiert worden.
Hab ich schon versucht, mit einer tableview und benutzerdefinierte Zellen statt programmgesteuert erstellen der UI für die Seite, es funktioniert nicht wirklich, denn dies ist ein detail-Seite und ich habe nur ein einziges Objekt, wie meine Datenquelle anstelle des Arrays, welche die rowForIndexPath tableview delegate erwartet. Ich weiß, dass ich schreiben konnte, einige mapper Methode zum drehen des Objekts in ein array der Eigenschaften aber, die ich lieber vermeiden, wenn möglich.
Dank.
- Da in Ihrem Fall nur die Klasse initialisiert wurde, nicht die outlets, wie nib Initialisierung nicht zugewiesen wurde, können Sie versuchen
self = Bundle.main.loadNibNamed("Subview", owner: self, options: nil)?[0]
- Aussehen ..stackoverflow.com/a/33946855/4003548.
- stackoverflow.com/questions/35659714/... Dies sollte hilfreich sein
- Danke für die Antworten, wenn ich versuche, entweder die Lösung, die ich bin, sehen diese Fehlermeldung, wenn ich versuche mit Bündeln.main.loadLibNamed: diese Klasse ist nicht die key-value-coding-konform für den Schlüssel, die ich denke, ist ein Problem mit den Steckdosen. Ich sollte auch beachten, ich kann fügen Sie die xib-zu meinem storyboard mit überhaupt keine Probleme, vielleicht brauche ich mehr als einen, das ist, warum ich brauchen, um herauszufinden, wie es programmatisch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Gehen Sie zu
Subview.xib
und stellen Sie sicher, dass der Besitzer der Datei ist leer.Stellen Sie außerdem sicher, dass die Klasse für die Ansicht ausgewählt ist
Subview
.2) loszuwerden, die Initialisierung, also:
werden sollte:
3) Initialisieren Sie diese Weg:
Können Sie auch überprüfen Sie heraus diese.
http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6
So initialisieren Sie einen UIView-Klasse mit einer xib-Datei im Swift, iOS
Glück!
Wenn Sie behandeln müssen, IBOutlets ich schlage vor, Sie verwenden ein UIViewController als Eigentümer der xib statt einer UIView (beim erstellen eines UIViewController aus dem Datei-Menü gibt es die option zum erstellen auch ein xib)
Dann können Sie instanziieren Sie es auf diese Weise in der übergeordneten Ansicht
Entweder Weg müssen Sie Einschränkungen festlegen, oder Ende mit viewDidLayoutSubviews() wie vorgeschlagen in Swift: Fügen Sie ein xib-in einer UIView
Benutzerdefinierte Unterklassen kann schwierig sein, besonders bei der Verwendung von xib-Dateien. Mit dem code, den Sie gezeigt haben, ist es nicht klar, wo du gehst falsch, aber ja, wahrscheinlich verlieren die Auslass-Anschlüssen.
Hier ist ein funktionierendes Beispiel - enthält Obj-C und Swift-Versionen, einschließlich der Verwendung von benutzerdefinierten Klassen in den Interface Builder. Speziell für das, was Sie zu tun versuchen, Blick auf die Swift3/SW3LoadFromXIB Beispiel:
https://github.com/DonMag/IBDesignInspect