2016-07-19 9 views
0

私はコードでこのビュー階層をシミュレートしようとしている中で、既存のサブビューにビューを追加することはできません したがって、このような接続コンテナ」:は、ストーリーボードをプログラム

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

どのように私はこれはプログラム的に行うことができます? サブビューごとにカスタムクラスがあり、xibファイルもあります。 これは私がコードからサブビューをインスタンスだ方法です:

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) 

もまったく同じ結果でこれを試してみました:

 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) 

しかし追加「新しい」ビューは、他のビューの下にあります私はストーリーボードから既存のビューをインスタンス化しているので、意図した動作ではありません。

私はストーリーボード階層の順序に従っています。また、ビューはカスタムクラスとリンクされ、xibファイルもあります。しかし、私は私のアプリを実行するとき、私はこの変わった問題を持っています

私はここで間違って何ですか?助けてください

+0

を同じ操作を行いますfirstオブジェクトを取ってそこ以来取り組んでいる言ったように、今のビューはなります対応するコントローラがインスタンス化されると自動的にロードされます。コントローラクラスで必要なビューのコンセントを作成して使用することができます。 loadNibNamedを使用してプログラムでロードする必要はありません。 –

+0

はい、ビューが作成されます。しかし、私はプログラムでビューの数を設定したいので、1にするか、10にすることができます。複数のビューを作成するには、このビューを何回もインスタンス化する必要があります。これどうやってするの? – user3033437

答えて

0

あなたはそれがクラッシュする理由を理解するのに役立ちます。 loadNibNamedは、単一のビューではないオブジェクトの配列を返します。あなたはそれがviewShopScrollと強制的にそれをアンラップを返すと仮定しているので、これは間違いなく

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

をクラッシュします。あなたが最初の行は、あなたが

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

は `だけでなく他のすべてのケースのための十分なthatsのstoryboard`に割り当てられたビューのカスタムクラスの面積を

+0

私はこれをやっていますが、それもクラッシュしています。 vShopScroll = NSBundle.mainBundle()。loadNibNamed( "viewShopScroll"、所有者:vShopMain、options:nil).first as! viewShopScroll – user3033437

+0

クラッシュログには何が表示されますか? –

+0

タイプ 'yuApp.viewShopMain'(0x10a2fcf50)の値を 'yuApp.viewShopScroll'(0x10a2faf30)にキャストできませんでした。 – user3033437

関連する問題