2

ストーリーボードのセットアップ

2 つの UIViewController を持つ StoryBoard (iOS 5 以降) を使用したプロジェクトがあります。

タスクは、2 番目の UIViewController (CoordinationController) をプログラムでインスタンス化することですが、その XIB ファイルをユーザー インターフェイスの設計に使用したいと思います。

XIB を StoryBoard にコピーする明らかな回避策は、文書化されていない理由で機能しないか、使用できません。ルールでさえ、2 番目のストーリーボードのビュー コントローラーにビューがない場合、同じ名前の XIB を探すということです... 動作していません。

2 番目の UIViewController をインスタンス化し、その XIB ファイルを使用する方法は?

4

2 に答える 2

5

非常に簡単な解決策は、View Controller のプロパティをオーバーライドし、nibName読み込みたいビューをエンコードする nib の名前を返すことです。

- (NSString*) nibName
{
    NSLog( @"p.s. this is the nib that the storyboard generated: %@", [super nibName]);

    return @"MyViewController";
}

ストーリーボード コンパイラによって生成された nib の名前にアクセスできることに注意してください。この nib は、storyboard.storyboardc バンドル内にパッケージ化されたアプリ バンドルに含まれています。

この nibName 実装から nil を返すことができず、ローダーがdocs で説明されているルールを使用して nib を検索するデフォルトの動作を取得できないことに少し驚いています。

別の方法として (これは不正行為です)、ユーザー定義のランタイム属性をキー nibName で使用して、View Controller の Storyboard 自体に目的の nib 名を設定することもできます。プロパティの文書化されていないセッターがあるため、これは機能するため、実際にはこれを行わないでください。

ビューはビューコントローラーのライフサイクルの通常の過程でロードされるため、これは受け入れられた回答よりも優れたソリューションだと思います。つまり、コントローラーが提示される前に遅延してロードされるため、 init メソッドで前もってロードされます。そしてそれはより少ないコードです。

于 2014-01-10T00:50:04.350 に答える
5

nib ファイルをロードして、CoordinationController の initWithCoder: メソッドでビューを設定できます。

-(id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        UINib *nib = [UINib nibWithNibName:@"CoordinationController" bundle:nil];
        NSArray *nibObjects = [nib instantiateWithOwner:self options:nil];
        self.view = nibObjects.lastObject;
    }
    return self;
}
于 2013-04-01T16:59:27.390 に答える