UIViewとinitWithFrameとNIBファイル。NIBファイルを読み込むにはどうしたらよいですか。
質問内容
私は
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オブジェクトのようにデリゲートプロトコルを実装することで、ウィジェットを使用しているオブジェクトに興味深いイベントが通知されたり、ウィジェットをカスタマイズするために表示するデータを提供したりすることができます。
関連
-
[解決済み] ペン先を読み込んだが、「表示」コンセントが設定されていない
-
IOSラーニングノート「このクラスはxxxのキーバリューコーディングに対応していません」問題解決
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] プロジェクト内の単一ファイルのARCを無効にするにはどうしたらいいですか?
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] SwiftでiOSキーボードを任意の場所でタッチして閉じる
-
[解決済み] UIImageのサイズを変更する最も簡単な方法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XCode のコンパイル例外を解決する clang: error: linker command failed with exit code 1
-
iOSコンパイルポッドでエラー CocoaPods could not find compatible versions for pod "XXXXX" が報告される。
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] 文字列の長さを取得する
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] App Storeのアプリと連動させる方法
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] iOS 13でダークモードをオプトアウトすることは可能ですか?
-
[解決済み] 16進カラーバリューの使用方法