我想寫的二手像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。這只是一個約定與配置的問題。
如果您*需要*此,那麼我懷疑你應該重新考慮你的代碼。 – 2013-02-12 11:02:49
爲了避免混淆,寫一個名字很好的單行方法。方法調用開銷基本可以忽略不計,清晰度要高得多。 – zaph 2013-02-12 11:03:40
@Zaph同意 - 'UIViewController'已經處理使用命名約定時的用例 - 我在開始時偶然發現了這個,但它被記錄下來,所以我很驚訝人們覺得他們需要破解他們自己的解決方案 – 2013-02-12 11:20:58