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 中。

平板电脑:

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

苹果手机:

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

操作系统:

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

由于都是 Objective-C,我的一些控制器可以跨平台重用,而且我不喜欢每次需要视图控制器时都在代码中添加条件编译语句。此外,在一周中的不同日子在不同平台上工作时,知道您只需拨打电话就可以vc(@"Browser")得到您所期望的结果,无论是在 iPad、iPhone 还是 MAC 上。这只是约定与配置的问题。

4

2 回答 2

2

如果你只是打电话

[[BrowserViewController alloc] init];

然后UIViewController将通过以下方式搜索xib具有适当名称的

  1. 如果视图控制器类名以单词“Controller”结尾,如在 MyViewController 中,它会查找名称与类名匹配但不包含单词“Controller”的 nib 文件,如在 MyView.nib 中。

  2. 它查找名称与视图控制器类的名称匹配的 nib 文件。例如,如果类名为 MyViewController,它会查找 MyViewController.nib 文件。

上面的一行代码应该足够短,不能证明宏是合理的;)

于 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 回答