好的,這篇的標題叫"多目標(target)與Universal的選擇"
差別在哪裡呢...恩..差別如下
1.執行的時候判斷你現在要呈現的是ipad的畫面還是iphone -->這是Universal
2.一個是在編譯之前,就先選好哪些code要被執行 -->這是多Target
假設我們今天隨便先開一個Tab bar的Project ,然後把它選擇Device Family 是Universal
我們進入他的AppDelegate裡面看,會發現它用的是if判斷裝置是哪種裝置。
- UIViewController *viewController1, *viewController2;
- if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
- viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
- viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];
- } else {
- viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPad" bundle:nil] autorelease];
- viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPad" bundle:nil] autorelease];
- }
- self.tabBarController = [[[UITabBarController alloc] init] autorelease];
- self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
可以看到它用 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
這樣子的方式在判斷我現在到底要載入哪個xib檔案。
那多Target要怎麼做呢?
我們一樣開一個新的Tab bar project,不過不選Universal ,我們選iphone就可以了。
打開之後,可以看到果然只有一個target。
這時候我們右鍵點選Target,然後選擇Duplicate 或者直接按Cmd + D
會出現是否要新增給ipad用的target 的選項,當然也可以選擇維持複製原本的target就好
這時候我們當然是選一個給iPad用。
這時候就會發現我們多了一個Target叫做AnotherTarget-iPad
而且會自動幫你把原本iphone用的Xib,在複製一份給pad用
不過檔名沒有取的很好,通常我都會把給pad用的在後面補上xxxViewController_pad.h/.m/xib
但是還是看個人啦,哩爽就好~
這時候呢...我們點一下左上方的Scheme ...
幹...這名字也落差太大了,我們的Target 叫做"AnotherTarget-iPad"
它竟然顯示
AnotherTarget Copy
這啥小??能看嗎...
我們再來選擇一下下面的Manage Schemes ...把它改好一點。
接著選擇AnotherTarget iPad ,進入它的Build Setting
我們要找一個選項,叫做"Preprocessor Macros"
我們Add 一個key ,讓compiler可以挑出哪邊才是他要抓來用的code
我們新增一個叫做 _ForPad_ 的值到這個欄位裡面
當啷~就像這樣子
接著我們開始看Code ,這是一個TabBar ,我們一樣進入AppDelegate裡面看
原本的寫法很單純
- UIViewController *viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];
- UIViewController *viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
- self.tabBarController = [[[UITabBarController alloc] init] autorelease];
- self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
這時候我們要讓它可以辨識哪時候要Build For iPad 或者Build for iPhone
就要用到傳說中在很多範例看到但是卻不太會用的...(我啦)
#ifdef
#else
#endif
- //假設Scheme選擇的目標是ipad
- #ifdef _ForPad_
- viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_pad" bundle:nil] autorelease];
- viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_pad" bundle:nil] autorelease];
- viewController1.title = @"iPad 1";
- viewController2.title = @"iPad 2";
- //這else 用法跟一般的else一樣,前面沒有#ifdef是會錯誤的
- #else
- viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];
- viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
- viewController1.title = @"iPhone 1";
- viewController2.title = @"iPhone 2";
- // #ifdef裡面也可以在包#ifdef ,只是要close它就是了
- #endif
以下就是執行結果
另外...好像南部什麼開發者聚會要開始了...有興趣的可以一起來多多交流
-------------------------------------------------------------------------------------------------------------------------------
恩,先禮後兵,我看我前面的禮應該很夠了
該是靠北的時候了,不對是吿解的時候了...
我必須承認,我很討厭接外包,有多討厭呢...
恩...基本上如果不是熟人找我,一定是祝你得癌症或者其他之類的祝福不會少的
我缺錢嗎?恩...不買樂器的話,其實日子也還過的去
但是我就是不想讓iOS的價格,跟台灣其他的Program 一樣,變成廉價開發
就算你要我寫個Hello world之類很簡單的東西,我還是會開你覺得貴的價格
是的,我就是要你打退堂鼓,認真思考一下,拎北(你)這樣子花下去開發,值得嗎?
我覺得這問題應該列在我應該要開發什麼軟體之前,而且是很重要的一點
還有,我最討厭的就是削價競爭這種東西,這東西不是原物料,就算是原物料好了
我相信削價的結果,往往會用偷工減料來補那些被削掉的部份
例如台灣的道路一樣。
我的作風幾乎沒什麼變,當初在Apple 經銷商的時後
我常常會問客人:你為什麼要買蘋果?
客人的答案也是很可愛:小白很漂亮啊。看起來很美啊很高科技啊!
或者:這年頭不用Apple就遜掉啦之類的答案...
通常遇到這種我都是用洗腦的...
哎唷,不要買啦~相容性很差ㄟ(其實並不會...)
不好啦~這東西不適合打Game啦~(至少經典的遊戲都會在Mac有就好)
三八啦~買蘋果不如買螢幕就好啦(這是真的...)
通常會被我洗走的,就走了...
但是也有不死心的,回來找我買,不過這種往往都會變成我的好朋友 : )
而且會給他最好的服務與處理。
我想我如果接外包應該也是吧,很抱歉,我老是開這麼機掰的價位。
但是我還是要跟你說,剛好而已啦,別想太多。
好耳熟的告解喔
回覆刪除哈哈
一定要的啊!
回覆刪除