0

次のように使用されるLLVM用のCプリプロセッサマクロを作成しようとしています:

vc(@"Browser")

次のように展開されます。

[[BrowserViewController alloc] initWithNibName:@"BrowserViewController" bundle:nil]

私が思いつくことができる最高のものは次のとおりです。

vc(Browser)

これは次のように実装されます。

#define vc(xibName) [[xibName ## ViewController alloc] initWithNibName:[NSString stringWithFormat:@"%@ViewController", @#xibName] bundle:nil]

Browserただし、これ自体 (文字列リテラル以外) がトークンのように見えるため、ユーザーにとっては混乱を招く可能性があります。@"Browser"ユーザーがマクロを読む必要がなくても、意図が少し明確になります。

編集:

この背後にある動機は一見ばかげているように見えますが、私は iPhone、iPad、および OS X 用のアプリに取り組んでおり、Interface Builder でレイアウトされたビューでビュー コントローラーをインスタンス化する独自の方法があります。

iPad:

[[UIStoryboard storyboardWithName:@"StoryboardPad" bundle:nil] instantiateViewControllerWithIdentifier:@"Browser"];

iPhone:

[[UIStoryboard storyboardWithName:@"StoryboardPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"Browser"];

OS X:

[[BrowserViewController alloc] initWithNibName:@"BrowserViewController" bundle:nil]

すべてが Objective-C であるため、一部のコントローラーはプラットフォーム間で再利用されます。ビュー コントローラーが必要になるたびに条件付きコンパイル ステートメントをコードに散らかすのは好きではありません。さらに、異なる曜日に異なるプラットフォームで作業する場合vc(@"Browser")、iPad、iPhone、または MAC のいずれであっても、電話をかけるだけで期待どおりの結果が得られることを知っておくと役立ちます。これは、規則と構成の問題にすぎません。

4

2 に答える 2

2

電話するだけなら

[[BrowserViewController alloc] init];

次に、UIViewControllerxibは次の方法で適切な名前の を検索します

  1. ビュー コントローラーのクラス名が MyViewController のように「Controller」という単語で終わる場合、MyView.nib のように「Controller」という単語を除いたクラス名と一致する名前を持つ nib ファイルを探します。

  2. ビュー コントローラ クラスの名前と一致する名前の nib ファイルを探します。たとえば、クラス名が MyViewController の場合、MyViewController.nib ファイルを探します。

上記の 1 行のコードは、マクロを正当化しないように十分に短くする必要があります ;)

于 2013-02-12T11:04:41.907 に答える
0

関数がこれを実装する方法であることが判明しました。

id InstantiateViewControllerWithXib(NSString *xibName) {
    NSString *className = [xibName stringByAppendingString:@"ViewController"];
    return [[NSClassFromString(className) alloc] initWithNibName:className bundle:nil];
}

質問に厳密に答えるために、目的のマクロを定義できます。

#define vc(xibName) InstantiateViewControllerWithXib(xibName)
于 2013-02-12T11:41:58.193 に答える