2016-09-05 16 views
0

Iveは私が以前使用していたカスタムxibを作成しました。カスタムビューのインスタンスを作成し、サブビューとしてuiscrollviewに追加するだけです。アイブ氏は、私のビューコントローラSwift - カスタムXibビューをプログラムでサブビューとして追加

let cardView = CardView(coder: NSCoder()) 
cardView!.frame.size.width = 100 
cardView!.frame.size.height = 100 
scrollView.addSubview(cardView!) 

ののviewDidLoadのFUNC中のコードブロックを使用してみましたが、私はこのエラー

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '*** -containsValueForKey: cannot be sent to an abstract object 
of class NSCoder: Create a concrete instance!' 

EDIT取得しています:これはCardViewに接続迅速ファイルのコードです を.xib

import UIKit 

class CardView: UIView { 
@IBOutlet var view: UIView! 
@IBOutlet weak var cornerView: UIView! 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    NSBundle.mainBundle().loadNibNamed("CardView", owner: self, options: nil) 
    self.addSubview(view) 
    view.frame = self.bounds 

    cornerView.layer.cornerRadius = 3 
    cornerView.layer.masksToBounds = true 

    view.layer.shadowOffset = CGSizeMake(1, 5); 
    view.layer.shadowRadius = 2; 
    view.layer.shadowOpacity = 0.2; 
    view.layer.masksToBounds = false 
} 

} 

の代わりに、私は単にしようとした自動レイアウトを使用して、これらの2行から手動でサブビューを追加試験を高さと幅を設定(また、単にヘッドアップ私はiOS開発の新機能)

cardView!.frame.size.width = 100 
cardView!.frame.size.height = 100 
+1

あなたの質問には多くの混乱があります。 1)Iveは以前のストーリーボードで使用したカスタムxibを作成しました。カスタムxibをどのように作成したのですか.xib拡張子を持つ別個のファイルを意味します。つまり、xibのコンテンツをどこかで使用しているコードが表示されないということです。 2)あなたは自動レイアウト制約を使用していません3)コードフォームxibに何も初期化していません。私はポストを編集し、あなたがこの具体的な実装やあなたの目標と何かのグラフィックスを使用している完全なコードを投稿し、私は最良の方法を提案すると言うでしょう。 –

+0

@MaheshAgrawala私はちょうど – XvKnightvX

+1

のようなloadnibの行を変更するのを助けるポストの希望に編集しました。 'self.view = NSBundle.mainBundle()。loadNibNamed(" CardView "、所有者:nil、options:nil)[0] as! UIView'と一度だけ試してください –

答えて

0

ビューの初期化にカスタムXIBを使用した場合の使用方法は以下のとおりです。

あなたのようなビューのクラスでは、そのCardViewのコードのようになります。

class CardView: UIView { 
    @IBOutlet weak var cornerView: UIView! 

    func setupWithSuperView(superView: UIView) { 
     self.frame.size.width = 100 
     self.frame.size.height = 100 
     superView.addSubview(self) 

     cornerView = UIView(frame: self.bounds) 
     cornerView.layer.cornerRadius = 3 
     cornerView.layer.masksToBounds = true 

     view.layer.shadowOffset = CGSizeMake(1, 5); 
     view.layer.shadowRadius = 2; 
     view.layer.shadowOpacity = 0.2; 
     view.layer.masksToBounds = false 
    } 
} 

このクラスを初期化のために呼び出す場合は、これを使用します。

let cardView = NSBundle.mainBundle("CardView").loadNibNamed("", owner: nil, options: nil)[0] as! CardView 
cardView.setupWithSuperView(scrollView) 

これを一度お試しください。しかし、xibファイルの最初のビューがCardViewタイプであることを確認してください。私は最初のビューのクラスがCardViewであることを意味します。

+0

私はストーリーボードでもカードビューを使用していますが、カードビューを初期化しないと、このカードビューは中断しませんか? (私は約30の私は手動でストーリーボードに配置している) – XvKnightvX

+0

私はあなたが達成したいものを正確に得ていない。あなたはxibを使ったと言ったが、あなたはストーリーボードで使っていると言った。あなたにはおよそ30何がありますか?あなたはストーリーボードに30コントローラを配置しましたか? –

+0

私はあなたが間違ったアプローチであなたの要件を達成しようとしていると思います。異なるタイプのリストが必要な場合は、30種類のビューを設計してスクロール・ビューで使用するのではなく、異なるタイプの表ビュー・セルを使用することもできます。またはあなたがしたいことが何であるか。 –

関連する問題