web-dev-qa-db-ja.com

インターフェースビルダーに追加されたカスタムUIViewがxibをロードしない

Xibを使用してカスタムUIViewを作成しました。

さらに、ストーリーボードにUIViewControllerがあり、それにUIViewを追加して、そのクラスをカスタムUIViewに設定しました。

しかし、私がアプリを実行しているとき、ビューにはサブビューがありません。デバッグすると、すべてのサブビューがnullになります。

カスタムUIViewの.mには、次のinitメソッドが存在します。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

    }
    return self;
}

何が欠けていますか?

23
Luda

ご存知のように、UIViewControllerを使用すると、xibに接続するための-initWithNibName:bundle:メソッドがあります。
だが...
UIViewになると、-loadNibNamed:owner:options:を使用してxibでロードする必要があります。 (xibのビューにカスタムクラスを指定するだけでは機能しません


仮定:

  1. UIView というCustomXIBViewサブクラスを作成しました
    • New File> Cocoa Touch> Objective-C Class-Subclass of UIView
  2. シンプルビューユーザーインターフェイスを作成し、CustomXIBView という名前を付けました。
    • 新しいファイル>ユーザーインターフェース>表示

手順:

  1. CustomXIBViewのペン先に移動
  2. Viewを選択します(左ツールバー
  3. Show Identity Inspectorを選択します(右側のパネルの3番目のオプション
  4. CustomXIBViewViewカスタムクラスとして指定します
    • nibのCustomXIBViewFile's Ownerを使用して何もしないでください
  5. ドロップオブジェクトをドラッグしてCustomXIBView.hで接続します

コード:

//To load `CustomXIBView` from any `UIViewController` or other class: 
//instead of the following commented code, do the uncommented code
//CustomXIBView *myCustomXIBViewObj = [CustomXIBView alloc] init];
//[myCustomXIBViewObj setFrame:CGRectMake(0,0,320,480)];

//Do this:
CustomXIBView *myCustomXIBViewObj = 
     [[[NSBundle mainBundle] loadNibNamed:@"someView"
                                    owner:self
                                  options:nil]
                            objectAtIndex:0];
[myCustomXIBViewObj setFrame:CGRect(0, 
                                    0, 
                                    myCustomXIBViewObj.frame.size.width, 
                                    myCustomXIBViewObj.frame.size.height)];
[self.view addSubview:myCustomXIBViewObj];

ref: http://eppz.eu/blog/uiview-from-xib/

32
staticVoidMan