2017-03-20 4 views
0

Ich habe eine benutzerdefinierte Ansicht mit einer .xib-Datei für das Layout erstellt. Ich möchte diese Ansicht programmatisch als Unteransicht zu einer anderen Ansicht erstellen und hinzufügen.Programmgesteuertes Hinzufügen einer benutzerdefinierten Ansicht zu einer anderen Ansicht

Subview 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 nicht sicher, wie man das macht, erwartet der einzige Konstruktor zur Zeit eine Instanz von NSCoder, die ich nicht habe.

Ich habe versucht, eine zusätzliche initialiser zu geben: es

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:

let v = Subview(title: dataSource[i].whatever, text: dataSource[i].bla) 

Aber es scheitert beim Versuch, die Etikettenstellen auszupacken, was Sinn als die macht .xib wurde nicht initialisiert.

Ich habe bereits versucht, eine Tabellenansicht und benutzerdefinierte Zellen anstelle der programmatischen Erstellung der Benutzeroberfläche für die Seite, es funktioniert nicht wirklich, weil dies eine Detailseite ist und ich nur ein einzelnes Objekt als meine Datenquelle haben das Array, das der TableView-Delegat rowForIndexPath erwartet. Ich weiß, dass ich eine Mapper-Methode schreiben könnte, um das Objekt in ein Array seiner Eigenschaften zu verwandeln, aber ich würde das lieber vermeiden, wenn es möglich ist.

Danke.

+0

Da in Ihrem Fall nur die Klasse initialisiert wurde und nicht die Outlets als nib initialization nicht vergeben wurde, können Sie 'self = Bundle.main.loadNibNamed (" Subview ", Besitzer: self, Optionen: nil) [0 ] ' – iphonic

+0

schauen ..http: //stackoverflow.com/a/33946855/4003548. – vaibhav

+0

https://stackoverflow.com/questions/35659714/loading-a-xib-file-to-a-uiview-swift/35666644#35666644 Dies sollte hilfreich sein –

Antwort

1

1) Zum Subview.xib und stellen Sie sicher, dass die Datei Eigentümer leer gelassen wird.

enter image description here

Stellen Sie außerdem sicher, dass die Klasse für Ihre Ansicht als Subview ausgewählt ist.

enter image description here

2) Lassen Sie sich von der initializer los, so:

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 
    } 
} 

sein sollte:

class Subview: UIView { 

    @IBOutlet var view: UIView! 
    @IBOutlet var titleLabel: UILabel! 
    @IBOutlet var textLabel: UILabel! 
} 

3) Initialisieren Sie auf diese Weise lesen:

let view = UINib(nibName: "Subview", bundle: nil).instantiate(withOwner: nil, options: nil).first as! Subview 

Sie können diese auch überprüfen.

http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6

How to initialise a UIView Class with a xib file in Swift, iOS

Viel Glück!

0

Wenn benötigen Sie IBOutlets behandeln Ich schlage vor, Sie verwenden ein UIViewController als Eigentümer des xib anstelle eines UIView (bei Verwendung eines UIViewController aus dem Menü Datei die Erstellung besteht die Möglichkeit, auch ein xib zu erstellen)

Dann sind Sie kann es in der übergeordneten Ansicht

var subviewController: SubviewController? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     subviewController = SubviewController(nibName: nil, bundle: nil) 

     self.view.addSubview(subviewController!.view) 

     //Remember to call the IBOutlets only after adding the view 
     subviewController!.titleLabel.text = "This is the title" 

     subviewController!.view.frame = self.view.frame //Not suggested 
     //Instead set constraints here 
    } 

wie auch immer Sie Einschränkungen oder Ende mit viewDidLayoutSubviews gesetzt haben() auf diese Weise instanziiert wie in Swift: Add a xib into a UIView

0

Benutzerdefinierte Subklassen vorgeschlagen kann schwierig sein, ein Teil insbesondere bei der Verwendung von Xib-Dateien. Mit dem Code, den du gezeigt hast, ist nicht klar, wo du falsch liegst - aber ja, wahrscheinlich verlieren die Outlet-Verbindungen.

Hier ist ein funktionierendes Beispiel - enthält Obj-C und Swift-Versionen, einschließlich der Verwendung der benutzerdefinierten Klassen in Interface Builder. Speziell für das, was Sie versuchen, am swift3/SW3LoadFromXIB Beispiel zu tun, aussehen:

https://github.com/DonMag/IBDesignInspect

Verwandte Themen