2016-04-10 11 views
4

カスタムUIViewをMySample.xibに作成しました。 xibのFile OwnerにクラスMyViewを追加しました。xibからカスタムUIViewをプログラムで読み込み

MyView.swift

class MyView: UIView { 

    @IBOutlet var view: UIView! 

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

     setup() 
    } 

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

     setup() 
    } 

    func setup() { 
     NSBundle.mainBundle().loadNibNamed("MySample", owner: self, options: nil)    
     self.addSubview(self.view) 
    } 
} 

私は今、このような本MyViewMyControllerからファイルをロードしています:今、このビューを表示するには

MyController.swift

class MyController: UIViewController { 
    init() { 
     super.init(nibName: nil, bundle: nil) 

     view.addSubview(MyView()) 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

を、私は別のコントローラのコードを次のコードに使用しています。 s UIButton

presentViewController(MyController(), animated: true, completion: nil) 

これは画面に表示されます。しかし、問題は、ユーザーとのやり取りを受け入れないことです。私のカスタムビューでは、私はデータを表示するUITableViewを持っていますが、スクロールしたり、ユーザーのやり取りが不足しているためにタップしたりすることはありません。

私が間違っていることは何ですか?

+0

ビュー階層インスペクタを使用して、カスタムビューの上に何も表示されていないことを確認しましたか? – EmilioPelaez

+0

@EmilioPelaezはい私はそれをチェックしました、それの上に何もありません。 – codelearner

+0

'MyView'で' touchesBegan ... 'をオーバーライドするとどうなりますか?それは呼ばれるのですか? 'userInteractionEnabled'は真ですか? – EmilioPelaez

答えて

8

例にはいくつかの不必要なものがあります。

私はまだあなたがやろうとしているかわからないが、あなたは、あなたのビューコントローラにXIBからカスタムビューを追加する場合:

  1. は、XIBファイルのビューを作成しますドンをinitをオーバーライドする必要はなく、デフォルトのinit UIView()を使用してxibからのビューを初期化することはできませんので、MyViewクラスからinitメソッドを削除してください。

  2. あなたのIBBに表示されるビューは、使用するクラスタイプ(MyViewクラスと思われます)であることを確認してください。このようなビューのinitあなたのビューコントローラで

  3. class MyController: UIViewController { 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
    
         //Get all views in the xib 
         let allViewsInXibArray = NSBundle.mainBundle().loadNibNamed("MySample", owner: self, options: nil) 
    
         //If you only have one view in the xib and you set it's class to MyView class 
         let myView = allViewsInXibArray.first as! MyView 
    
         //Set wanted position and size (frame) 
         myView.frame = self.view.bounds 
    
         //Add the view 
         self.view.addSubview(myView) 
    
         //TODO: set wanted constraints. 
        } 
    } 
    
+0

このエラーが発生しました: '***キャッチされていない例外によるアプリケーションの終了 'NSUnknownKeyException '、理由:' [ setValue:forUndefinedKey:]:このクラスはキーラベルのキーコードに準拠していません。 ' – codelearner

+0

おそらくxibに接続不良があります。可能であれば新しいxibを作成し、最初に新しいxibを作成し、ビューのクラスを関連するビュークラスに設定し、背景色を設定して、動作することを確認します。 –

+0

オーナーとして 'self'を使うのではなく、' MyView() 'を使ってすべてのイベントをビューがリンクされているMyViewクラスに転送する必要があります。 – codelearner

0

代わりのMyViewにXIB File's Ownerクラスをリンクし、私はMyViewにXIBでルートビューのクラスを変更する必要があります。

let allViewsInXibArray = NSBundle.mainBundle().loadNibNamed("MySample", owner: MyView(), options: nil) 

MyViewFile's Ownerクラスを使用するだけをされています。そして、@Olegシャーマンコードに基づいて、それはそれ以外の場合はエラーthis class is not key value coding-compliant for the key ****.がスローされます、すべてのそれのイベントを取得するには、所有者としてMyView()を加えるの小さな変化で完璧に動作しますストーリーボードでxibを使用する必要がある場合は、が必要です。

File's OwnerクラスからMyViewまでを使用する回避策があるかどうかは、私のオリジナルの質問のようにカスタムコントローラーからxibをプログラムで読み込んでいるときはわかりません。

+0

私の場合は...これは私のために働く...私は私のxibクラスに私の所有者を変更します。 :let mCuentasView = Bundle.main.loadNibNamed( "CajaAhorroView"、所有者:self.mContainerCuenta、options:nil)![0] as! UIView self.mContainerView.addSubview(mCuentasView) mCuentasView.frame = self.mContainerView.bounds – xhinoda

関連する問題