web-dev-qa-db-ja.com

カスタムサブビュー(xibで作成された)をView Controllerのビューに追加する-何が間違っていますか

Xibにビューを作成しました(アクティビティインジケーター、進行状況ビュー、ラベル付き)。次に、.h/.mファイルを作成しました。

#import <UIKit/UIKit.h>

@interface MyCustomView : UIView {
    IBOutlet UIActivityIndicatorView *actIndicator;
    IBOutlet UIProgressView *progressBar;
    IBOutlet UILabel *statusMsg;
}

@end

#import "MyCustomView.h"

@implementation MyCustomView    

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Initialization code
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}

@end

IBでは、ファイルの所有者とビューIDをMyCustomViewに設定し、IBOutletをファイルの所有者に接続します

MyViewController.mでは、次のことを行いました。

- (void)viewDidLoad {

    [super viewDidLoad];   

    UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame];
    [subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]];

    [myTableView addSubview:subView];
    [subView release];
}

アプリを実行すると、ビューが追加されますが、ラベル、進行状況バー、アクティビティインジケーターが表示されません。

何が間違っていますか?

61
Sefran2

_-loadNibNamed_メソッドを使用してロードする必要があります。 _-initWithNibName_はUIViewControllers専用です。

次のコードをMyCustomView initメソッドに追加します。

_NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil];
UIView *mainView = [subviewArray objectAtIndex:0];
[self addSubview:mainView];
_

Nibからオブジェクトを初期化する場合、- (id)initWithCoder:(NSCoder *)aDecoderを呼び出して初期化するため、nib内でMyCustomViewオブジェクトを作成する場合はオーバーライドする必要があります。 _initWithFrame:_で実行している場合は、それをオーバーライドして上記のコードを追加してください。また、ペン先で、トップレベルのUIViewが1つあることを確認し、その中に他のすべての要素を配置します(subviewArrayに1つのエントリのみが含まれるようにします)。

これにより、nibからビューがロードされ、オブジェクトに追加され、トリックが実行されます。

131
Ned

この方法を使用する必要があると思います:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

これは、「nibNameOrNil」で.xibファイル名を渡す必要があるためです。

1
hocker

Hockerが言ったように、XIB名(拡張子なし)を渡すメソッドを使用する必要があります。

次に、このリストを制御する必要があります。

  • IBで.xibファイルを開きます
  • [ファイル所有者]をクリックして、正しいクラス(この場合はMyCustomView)を選択します
  • コントロールを押したまま、ファイル所有者からビューにドラッグします(ビューのアウトレットは問題ありません)

それがうまくいくことを願っています。乾杯。

0
Lorenzo B