2013-02-12 77 views
0

我想寫的二手像LLVM一個C預處理器宏:將字符串轉換爲令牌的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。這只是一個約定與配置的問題。

+0

如果您*需要*此,那麼我懷疑你應該重新考慮你的代碼。 – 2013-02-12 11:02:49

+2

爲了避免混淆,寫一個名字很好的單行方法。方法調用開銷基本可以忽略不計,清晰度要高得多。 – zaph 2013-02-12 11:03:40

+1

@Zaph同意 - 'UIViewController'已經處理使用命名約定時的用例 - 我在開始時偶然發現了這個,但它被記錄下來,所以我很驚訝人們覺得他們需要破解他們自己的解決方案 – 2013-02-12 11:20:58

回答

0

原來的功能是實現這一點的方法:

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

要嚴格回答問題,然後可以定義所需的宏:

#define vc(xibName) InstantiateViewControllerWithXib(xibName) 
2

如果你只需要調用

[[BrowserViewController alloc] init]; 

然後UIViewController會爲xib搜索使用適當的名稱通過以下方式

  1. 如果視圖控制器類名用字結尾「控制器「,就像在MyViewController中一樣,它會查找名稱與沒有」Controller「字樣的類名相匹配的nib文件,就像在MyView.nib中一樣。

  2. 它查找名稱與視圖控制器類名稱相匹配的nib文件。例如,如果類名是MyViewController,它將查找MyViewController.nib文件。

上面的一行代碼應該是足夠短,不能證明宏)

+1

甚至更​​短? '[BrowserViewController new];' – Murlakatam 2013-02-12 11:21:40

+0

@Murlakatam這是一種風格的東西,但'new'通常不如更明確的'alloc/init',但確定它會工作並且更短 – 2013-02-12 11:27:57

+0

多年來,'new'是氣餒,但隨着ARC Apple文檔的出現,現在包括使用'new'。 – zaph 2013-02-12 11:28:31