1. ホーム
  2. ios

UIViewとinitWithFrameとNIBファイル。NIBファイルを読み込むにはどうしたらよいですか。

2023-09-03 09:41:47

質問内容

私は UIView という baseView で、その中に initWithFrame があり、そこに他のビューを追加して、いくつかのカスタムなことを行っています。同じビューには NIB ファイルもあります。

ここで、私は UIViewController という名前のクラスがあります。 AppController を追加したいのですが、その中に baseView のビューに AppController ビューに変換する必要があるため、このような方法をとっています。

self.view = baseView; しかし、問題はNIBファイルがロードされないことです。カスタマイズされたものと NIB ファイルを確実にロード/実行するにはどうしたらよいでしょうか。

どのように解決するのですか。

あなたの "baseView" クラスがどのように使用され、あなたのアプリケーションに統合されることを意図しているかによって、多くのオプションがあります。 UIViewController のサブクラスのビューとして、または再利用可能なモジュール コンポーネントとして、多くの異なるビュー コントローラーで使用するためにアプリケーション全体で複数回インスタンス化されることを意味します。

UIViewController のサブクラスで唯一のビューとして使用する場合は、Phonitive が正しいです。UIViewController のサブクラスの .xib ファイルと一緒にバンドルして、UIViewController の viewDidLoad を使用して最終的に初期化します。

しかし、View クラスを異なるビューコントローラで何度も再利用するサブコンポーネントとしたい場合、コードで統合するか、別のコントローラの .xib ファイルに含めるか、両方のケースを処理するために initWithFrame: init メソッドと awakeFromNib の両方を実装する必要があります。 内部初期化に、常に .xib からのオブジェクトが含まれる場合、initWithFrame では、コードでウィジェットを作成することを望む "customer" クラスをサポートするために、手動で .xib をロードする必要があります。 同様に、.xib ファイルにオブジェクトが含まれている場合、awakeFromNib からコードで必要な最終化を呼び出すことを確認する必要があります。

UI デザインを nib に含む UIView サブクラスコンポーネントを作成する方法の例です。

MyView.h:

@interface MyView : UIView
{
    UIView *view;
    UILabel *l;
}
@property (nonatomic, retain) IBOutlet UIView *view;
@property (nonatomic, retain) IBOutlet UILabel *l;

MyView.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クラスに変更する必要があります)。

ビューとラベルのアウトレットを File の Owner に接続することを忘れないようにしましょう。 以上です。 再利用可能なUIViewウィジェットを作成するためのテンプレートです。

この構造で本当に素晴らしいことは、他の nib ファイルに MyView オブジェクトのインスタンスを配置することができることです。 UIKitオブジェクトのようにデリゲートプロトコルを実装することで、ウィジェットを使用しているオブジェクトに興味深いイベントが通知されたり、ウィジェットをカスタマイズするために表示するデータを提供したりすることができます。