Benutzerdefinierte UIView-Unterklasse, mit XIB in Swift

Bin ich mit Swift und Xcode 6.4 für was es Wert ist.

Also ich habe einen view-controller wird mit mehrere Paare von UILabels und UIImageViews. Ich wollte das UILabel-UIImageView-pair-Mädchen in eine eigene UIView, so konnte ich einfach die Wiederverwendung der gleichen Struktur wiederholt innerhalb der oben genannten view-controller. (Ich bin mir bewusst, könnte dies übersetzt werden in eine UITableView, aber für den sake von ~lernen~ bitte Geduld mit mir). Diese entpuppt sich als eine mehr komplizierte Prozess, als ich es mir vorgestellt hatte, ich habe Schwierigkeiten, herauszufinden, den "richtigen" Weg, um diese arbeiten alle in IB.

Derzeit habe ich schon zappelte, um mit einer UIView-Unterklasse und zugehörige XIB und überschreiben Sie die init(frame:) und init(coder), laden der view aus der nib und das hinzufügen von es als eine Untersicht. Dies ist, was ich gesehen/Lesen rund um das internet so weit. (Dies ist ungefähr: http://iphonedev.tv/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6).

Dieser hat mir das problem verursacht eine Endlosschleife zwischen init(Programmierer) und laden Sie die Feder aus dem bundle. Seltsamerweise ist keiner von diesen Artikeln oder den vorherigen Antworten auf stack overflow erwähne dies!

Ok also habe ich ein check-in init(coder), um zu sehen, wenn die Untersicht wurde bereits Hinzugefügt. Das "gelöst", die, scheinbar. Allerdings rannte ich in ein Problem mit meiner benutzerdefinierten Ansicht outlets wird null durch die Zeit, die ich versuchen, Ihnen einen Wert zuteilen.

Machte ich einen didSet und fügte hinzu, einen Haltepunkt, einen Blick zu nehmen...Sie sind definitiv festgelegt wird, zu einem Punkt, aber durch die Zeit, die ich versuchen, zu sagen, ändern Sie die Textfarbe eines Labels, das label ist gleich null.
Ich bin irgendwie reißen mir die Haare aus hier.

Wiederverwendbare Komponenten scheinen, wie software-design 101, aber ich fühle mich wie Apple verschworen gegen mich. Sollte ich suchen, um container VCs hier? Sollte ich einfach verschachteln von views und ein blöd riesige Menge von Verkaufsstellen, die in meinem Haupt-VC? Warum ist das so gebogen? Warum muss jeder die Beispiele bei mir NICHT funktioniert?

Gewünschte Ergebnis vorgeben, die ganze Sache ist die VC, die Boxen sind die benutzerdefinierten uiviews ich will):

Benutzerdefinierte UIView-Unterklasse, mit XIB in Swift

Vielen Dank für das Lesen.

Folgende ist meine eigene UIView-Unterklasse. In meinem Haupt-storyboard, ich habe UIViews mit der Unterklasse gesetzt, als Ihre Klasse.

class StageCardView: UIView {

@IBOutlet weak private var stageLabel: UILabel! {
    didSet {
        NSLog("I will murder you %@", stageLabel)
    }
}
@IBOutlet weak private var stageImage: UIImageView!

var stageName : String? {
    didSet {
        self.stageLabel.text = stageName
    }
}
var imageName : String? {
    didSet {
        self.stageImage.image = UIImage(named: imageName!)
    }
}
var textColor : UIColor? {
    didSet {
        self.stageLabel.textColor = textColor
    }
}
var splatColor : UIColor? {
    didSet {
        let splatImage = UIImage(named: "backsplat")?.tintedImageWithColor(splatColor!)
        self.backgroundColor = UIColor(patternImage: splatImage!)
    }
}

//MARK: init
required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    if self.subviews.count == 0 {
        setup()
    }
}

override init(frame: CGRect) {
    super.init(frame: frame)
    setup()
}

func setup() {
    if let view = NSBundle.mainBundle().loadNibNamed("StageCardView", owner: self, options: nil).first as? StageCardView {
        view.frame = bounds
        view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight

        addSubview(view)
    }
}




/*
//Only override drawRect: if you perform custom drawing.
//An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
    //Drawing code
}
*/

}

EDIT: Hier ist, was ich in der Lage gewesen, um so weit...

XIB:

Benutzerdefinierte UIView-Unterklasse, mit XIB in Swift

Ergebnis:

Benutzerdefinierte UIView-Unterklasse, mit XIB in Swift

Problem: Beim ersten Zugriff auf die label-oder image-outlets, Sie sind null. Bei der überprüfung am Haltepunkt der sagte, der Zugriff auf die Etiketten-und Bild-Untersichten sind da und die view-Hierarchie ist, wie erwartet.

Ich bin OK mit dabei, alle im code, wenn es das ist, was es braucht, aber ich bin nicht riesig, das zu tun, Autolayout-in-code, so würde ich das eher nicht wenn es einen Weg gibt, es zu vermeiden!

BEARBEITEN/FRAGE SHIFT:

Ich herausgefunden, wie man die Steckdosen aufhören, null.

Benutzerdefinierte UIView-Unterklasse, mit XIB in Swift

Inspiration von diesem SO beantworten: Geladen Feder, aber die Aussicht Steckdose war nicht gesetzt - neu InterfaceBuilder außer anstelle von zuweisen der Ansicht, Steckdose, wies ich die einzelnen Komponente outlets.

Das war jetzt an dem Punkt, wo ich nur war, schleuderte scheisse an eine Wand und sehen, wenn es würde stick. Weiß jemand, warum ich dies tun musste? Welche Art von dunkler Magie ist das?

  • haben Sie keine Lösung gefunden?
InformationsquelleAutor Fozzle | 2015-09-01
Schreibe einen Kommentar