2016-07-19 18 views
0

Ich versuche, diese Ansicht Hierarchie in Code zu simulieren:kann nicht im Hinblick auf eine bestehende subview in Storyboard hinzufügen programmatisch

"scene" 
    "view Shop Main"      -> `UIView` 
     "view shop scroll"     -> `UIScrollView` 
      "ViewDetail"     -> `UIView` 
       "Shop Connected Container" -> `UIView` 
        "Connected Shop"  -> `UIView` 

ich multiples „Connected Shop“ instanziiert wollen und fügen Sie sie in „Shop verbunden Container“ So wie folgt aus:

"scene" 
    "view Shop Main"      -> `UIView` 
     "view shop scroll"     -> `UIScrollView` 
      "ViewDetail"     -> `UIView` 
       "Shop Connected Container" -> `UIView` 
        "Connected Shop"  -> `UIView` 
        "Connected Shop"  -> `UIView` 
        "Connected Shop"  -> `UIView` 

Wie kann ich dies tun programmatisch ?? Ich habe eine benutzerdefinierte Klasse für jede Unteransicht und eine XIB-Datei. Dies ist, wie ich die Subviews aus dem Code bin instanziiert:

override func viewDidLoad() { 

    /*1*/   let vShopMain = NSBundle.mainBundle().loadNibNamed("viewShopMain", owner: self, options: nil).first as! viewShopMain 
    /*2*/  let vShopScroll = NSBundle.mainBundle().loadNibNamed("viewShopScroll", owner: vShopMain, options: nil).first as! viewShopScroll 

    /*3*/  let vDetail : UIView = NSBundle.mainBundle().loadNibNamed("viewDetail", owner: vShopScroll, options: nil).first as! viewDetail 
// 
// 
    /*4*/  let sConContainer : UIView = NSBundle.mainBundle().loadNibNamed("shopConnectedContainer", owner: vDetail, options: nil).first as! shopConnectedContainer 
    /*5*/  let cShop = NSBundle.mainBundle().loadNibNamed("connectedShop", owner: sConContainer, options: nil).first as! connectedShop 


     cShop.bannerTitle.text = "Shop Title" 

     vShopMain.addSubview(vShopScroll) 
     vShopScroll.addSubview(vDetail) 
     vDetail.addSubview(sConContainer) 
     sConContainer.addSubview(cShop) 


     self.view.addSubview(sConContainer) 

auch versucht, dies mit dem exakt gleichen Ergebnis:

 let vShopMain = UINib(nibName: "viewShopMain", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! viewShopMain 

     let scroll = UINib(nibName: "viewShopScroll", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! viewShopScroll 

     let vDetail = UINib(nibName: "viewDetail", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! viewDetail 

     let sConContainer = UINib(nibName: "shopConnectedContainer", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! shopConnectedContainer 

     let cShop = UINib(nibName: "connectedShop", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! connectedShop 

     cShop.bannerTitle.text = "hola" 

     vShopMain.addSubview(scroll) 
     scroll.addSubview(vDetail) 
     vDetail.addSubview(sConContainer) 
     sConContainer.addSubview(cShop) 


     self.view.addSubview(sConContainer) 

Aber die „neuen“ hinzugefügt Ansichten unter der anderen Ansicht sind, Das ist nicht das beabsichtigte Verhalten, da ich vorhandene Ansichten vom Storyboard instanziiere und keine neuen erzeuge.

Ich folge der Reihenfolge der Storyboard-Hierarchie. Auch die Ansichten sind mit ihren benutzerdefinierten Klassen verknüpft, und sie haben ihre XIB-Dateien. Aber wenn ich meine App starte, habe ich dieses seltsame Problem

Was mache ich hier falsch? Bitte helfen Sie

+0

'Ansicht der benutzerdefinierten Klassen Bereich genug in storyboard' das ist zugewiesen, jetzt wird der Blick automatisch geladen werden, wenn der entsprechende Controller instanziiert wird. Sie können eine Steckdose in der von Ihnen gewünschten Ansicht in der Controller-Klasse erstellen und verwenden. Keine Notwendigkeit, es zu laden programmgesteuert laden mit 'loadNibNamed' –

+0

ja, die Ansicht wird erstellt. Aber ich möchte die Anzahl der Ansichten programmatisch einstellen, also kann es 1 sein oder es kann 10 sein. Ich muss diese Ansicht mehrere Male instanziieren, um mehr als eine zu erstellen. Wie kann ich das machen? – user3033437

Antwort

0

Helfen Sie, herauszufinden, warum es abstürzt. loadNibNamed gibt ein Array von Objekten zurück, nicht eine einzelne Ansicht. So wird dies definitiv

let vShopScroll = NSBundle.mainBundle().loadNibNamed("viewShopScroll", owner: self, options: nil) as! viewShopScroll 

abstürzen, da Sie es unter der Annahme, kehrt viewShopScroll und Abwickeln sie mit Nachdruck. Wie Sie gesagt haben Ihre erste Linie dort arbeitet, da Sie die first Objekt unter

let vShopMain = NSBundle.mainBundle().loadNibNamed("viewShopMain", owner: self, options: nil).first as! viewShopMain 

Machen Sie dasselbe für alle anderen Fälle auch

+0

Also mache ich das, aber es stürzt auch ab: Lassen Sie vShopScroll = NSBundle.mainBundle(). LoadNibNamed ("viewShopScroll", Besitzer: vShopMain, Optionen: nil) .erst as! viewShopScroll – user3033437

+0

Was sagt das Crash-Log? –

+0

Der Wert 'yuApp.viewShopMain' (0x10a2fcf50) konnte nicht in 'yuApp.viewShopScroll' (0x10a2faf30) umgewandelt werden. – user3033437