3

ユーザーの操作に基づいて、異なる時間に複数のサブビューをロードする UIViewController があります。私は当初、nib ファイルを使用せずに、これらすべてのサブビューをコードで作成しました。現在、カスタム UIView サブクラスを含む nib ファイルに移行しています。

これらのサブビューの一部は静的データを表示し、loadNibNamed:owner:options:を使用してビュー コントローラーに読み込みます。その他には、アクセスする必要があるコントロールが含まれています。

Apple がコンテンツの画面ごとに 1 つのビュー コントローラーを使用し、ジェネリック コントローラー オブジェクト (NSObjects) を使用して画面のサブセクションを管理するという理由を (ある程度) 理解しています。

したがって、ビュー コントローラー、ジェネリック コントローラー、ビュー クラス、および nib が必要です。これをすべてまとめるにはどうすればよいですか?

私の作業の仮定とその後の質問:

  • IB の「クラス ID」ドロップダウンでビュー クラスを nib に関連付けます。
  • ビュー コントローラーは、画面全体のやり取りを調整します。必要に応じて、汎用コントローラーのインスタンスを作成します。
  • 汎用コントローラーはペン先をロードしますか? どのように?
  • そのビュー クラスでアウトレットとアクションを定義する必要がありますか、それともジェネリック コントローラーで定義する必要がありますか?
  • ビュー コントローラとジェネリック コントローラの間でメッセージを渡すにはどうすればよいですか?

このようにコントローラを使用したサンプル コードを誰かが教えてくれれば、理解に大いに役立ちます。私が読んだ本やスタックオーバーフローの投稿はどれも、まだ十分に的を射ていません。

4

2 に答える 2

3

さて、私はそれを理解したと思います:

  1. NSObject を拡張して CustomController を作成する
  2. nib の UIView への参照を含め、CustomController.h でアウトレットとアクションを定義します。
  3. nib の File's Owner を CustomController に設定します。
  4. UIViewアウトレットを含む、通常どおりすべてのアウトレットとアクションを接続します
  5. CustomController.m init で、nib をロードします。

- (id)init {
    self = [super init];
    if (self != nil)
        [self loadNib];

    return self;
}

- (BOOL)loadNib {
    NSArray *topLevelObjs = nil;
    topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];

    if (topLevelObjs == nil) {
        NSLog(@"Error! Could not load nib file.\n");
        return NO;
    }
    return YES;
}

新しい NSObject ベースのコントローラーは、View Controller と非常によく似た働きをします。

于 2010-04-01T00:38:30.050 に答える
1

あなたが望むものは、私が「再利用可能なUIViewウィジェット」を作り出したように思えます-何かをする/アプリの画面にいつでも何回でも組み込むことができるディスプレイを提示する再利用可能なウィジェット-あなたはそれらを作成することができます純粋にコードで作成するか、フレームを別のxibファイルに配置してインスタンス化します(ただし、ウィジェットの内部パラメーターをxibファイルで変更することはできません。IBプラグインが必要になります)。

これは私がどこでも議論されたのを見たことがない組織です。iOSプログラミングの初期の私の欲求不満の一部は、このようなものを望んでいるが、どの例でもそれを表現する方法が見当たらないことです。

この質問の私の答えを見て、それをどのように構成できるかを確認してください。

UIViewとinitWithFrameおよびNIBファイル。NIBファイルをロードするにはどうすればよいですか?

直接/低レベルのイベントのすべてのウィジェット内部処理をuiviewウィジェットサブクラスに配置し、ウィジェットクライアントとの高レベルの対話のためのデリゲートプロトコルを実装することをお勧めします(つまり、手動でボタンにアクセスする代わりに「loginRequested:userName:passWord」およびウィジェット内部のテキストフィールド)。

ウィジェットの(オプションですが推奨される)xibファイルにはウィジェットの所有者がいて、ウィジェットのinitコードはxibファイルをロードする義務を負っています。ウィジェットの顧客は、単にウィジェットをインスタンス化し、ウィジェットの委任関数がそれに意味をなすものを実装します。

于 2012-01-20T14:22:20.823 に答える