UIView
と呼ばれるものがありbaseView
、その中にinitWithFrame
他のビューを追加したり、カスタム操作を行ったりできます。同じビューには NIB ファイルもあります。
今、ビューのビューにビューを追加したい というUIViewController
名前のクラスがあるので、次のようにします。AppController
baseView
AppController
self.view = baseView;
しかし、問題は NIB ファイルが読み込まれないことです。カスタマイズされた内容と NIB ファイルが読み込まれて実行されるようにするにはどうすればよいでしょうか?
ベストアンサー1
「baseView」クラスがどのように使用され、アプリケーションに統合されるかに応じて、多くのオプションがあります。このクラスをどのように使用するかは明確ではありません。UIViewController サブクラスのビューとして使用するか、または、さまざまなビュー コントローラで使用するために、アプリケーション全体で複数回インスタンス化される再利用可能なモジュール コンポーネントとして使用するかです。
ビューが UIViewController サブクラス内の唯一のビューとなることを意図している場合は、Phonitive が正しいです。つまり、それを UIViewController サブクラスの .xib ファイルと一緒にバンドルし、UIViewController の viewDidLoad を使用して最終的な初期化を行います。
ただし、View クラスを、コードまたは別のコントローラーの .xib ファイルへの組み込みによって統合され、異なるビュー コントローラーで複数回再利用されるサブコンポーネントにする場合は、両方のケースを処理するために、initWithFrame: init メソッドと awakeFromNib の両方を実装する必要があります。内部初期化に常に .xib からのオブジェクトが含まれる場合は、コードを介してウィジェットを作成する「顧客」クラスをサポートするために、initWithFrame で .xib を手動で読み込む必要があります。同様に、.xib ファイルにオブジェクトが含まれている場合は、コードで必要な終了処理を awakeFromNib から呼び出す必要があります。
以下は、nib の UI デザインを使用して UIView サブクラス コンポーネントを作成する方法の例です。
MyView.h:
@interface MyView : UIView
{
UIView *view;
UILabel *l;
}
@property (nonatomic, retain) IBOutlet UIView *view;
@property (nonatomic, retain) IBOutlet UILabel *l;
マイビュー.m:
#import "MyView.h"
@implementation MyView
@synthesize l, view;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code.
//
[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}
- (void) awakeFromNib
{
[super awakeFromNib];
// commenters report the next line causes infinite recursion, so removing it
// [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
[self addSubview:self.view];
}
- (void) dealloc
{
[l release];
[view release];
[super dealloc];
}
nib ファイルは次のようになります (ただし、ファイルの所有者を MyView クラスに変更する必要があります)。
ビューとラベルの両方のアウトレットを必ずファイルの所有者に接続してください。これで完了です。再利用可能な UIView ウィジェットを作成するためのテンプレートです。
この構造の本当に素晴らしい点は、MyView オブジェクトのインスタンスを他の nib ファイルに配置できることです。UIView を必要な場所/サイズに配置し、アイデンティティ インスペクター (CMD-4) でクラスを MyView に変更するだけで、必要なビューにウィジェットのインスタンスが作成されます。UIKit オブジェクトと同様に、デリゲート プロトコルを実装して、ウィジェットを使用するオブジェクトに興味深いイベントを通知したり、ウィジェットに表示するデータを提供してウィジェットをカスタマイズしたりできます。