2012年4月30日 星期一

多目標(target)與Universal的選擇

本來是想寫另外一篇的...但是還卡在怎麼安排比較恰當所以就先寫一篇短的

好的,這篇的標題叫"多目標(target)與Universal的選擇"


差別在哪裡呢...恩..差別如下

1.執行的時候判斷你現在要呈現的是ipad的畫面還是iphone   -->這是Universal

2.一個是在編譯之前,就先選好哪些code要被執行                -->這是多Target

假設我們今天隨便先開一個Tab bar的Project ,然後把它選擇Device Family 是Universal

我們進入他的AppDelegate裡面看,會發現它用的是if判斷裝置是哪種裝置。



  1. UIViewController *viewController1, *viewController2;
  2.     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
  3.         viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
  4.         viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];
  5.     } else {
  6.         viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPad" bundle:nil] autorelease];
  7.         viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPad" bundle:nil] autorelease];
  8.     }
  9.     self.tabBarController = [[[UITabBarController alloc] init] autorelease];
  10.     self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];


可以看到它用 if ([[UIDevice currentDeviceuserInterfaceIdiom] == 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

接著選擇AnotherTarget iPad ,進入它的Build Setting

我們要找一個選項,叫做"Preprocessor Macros"

我們Add 一個key ,讓compiler可以挑出哪邊才是他要抓來用的code

我們新增一個叫做 _ForPad_ 的值到這個欄位裡面



當啷~就像這樣子

接著我們開始看Code ,這是一個TabBar ,我們一樣進入AppDelegate裡面看

原本的寫法很單純


  1.  UIViewController *viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];
  2.     UIViewController *viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
  3.     self.tabBarController = [[[UITabBarController alloc] init] autorelease];
  4.     self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];

這時候我們要讓它可以辨識哪時候要Build For iPad 或者Build for iPhone 

就要用到傳說中在很多範例看到但是卻不太會用的...(我啦)


#ifdef 
    
#else
    
#endif

最後在把程式碼改成這樣子

  1. //假設Scheme選擇的目標是ipad
  2. #ifdef _ForPad_
  3.     viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_pad" bundle:nil] autorelease];
  4.     viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_pad" bundle:nil] autorelease];
  5.     viewController1.title = @"iPad 1";
  6.     viewController2.title = @"iPad 2";
  7. //else 用法跟一般的else一樣,前面沒有#ifdef是會錯誤的
  8. #else
  9.     viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];
  10.     viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
  11.     viewController1.title = @"iPhone 1";
  12.     viewController2.title = @"iPhone 2";

  13. // #ifdef裡面也可以在包#ifdef ,只是要close它就是了
  14. #endif


這就清楚了吧~

以下就是執行結果




另外...好像南部什麼開發者聚會要開始了...有興趣的可以一起來多多交流

-------------------------------------------------------------------------------------------------------------------------------

恩,先禮後兵,我看我前面的禮應該很夠了

該是靠北的時候了,不對是吿解的時候了...

我必須承認,我很討厭接外包,有多討厭呢...

恩...基本上如果不是熟人找我,一定是祝你得癌症或者其他之類的祝福不會少的

我缺錢嗎?恩...不買樂器的話,其實日子也還過的去


但是我就是不想讓iOS的價格,跟台灣其他的Program 一樣,變成廉價開發

就算你要我寫個Hello world之類很簡單的東西,我還是會開你覺得貴的價格

是的,我就是要你打退堂鼓,認真思考一下,拎北(你)這樣子花下去開發,值得嗎?

我覺得這問題應該列在我應該要開發什麼軟體之前,而且是很重要的一點

還有,我最討厭的就是削價競爭這種東西,這東西不是原物料,就算是原物料好了

我相信削價的結果,往往會用偷工減料來補那些被削掉的部份

例如台灣的道路一樣。



我的作風幾乎沒什麼變,當初在Apple 經銷商的時後

我常常會問客人:你為什麼要買蘋果?

客人的答案也是很可愛:小白很漂亮啊。看起來很美啊很高科技啊!

或者:這年頭不用Apple就遜掉啦之類的答案...

通常遇到這種我都是用洗腦的...


哎唷,不要買啦~相容性很差ㄟ(其實並不會...)

不好啦~這東西不適合打Game啦~(至少經典的遊戲都會在Mac有就好)

三八啦~買蘋果不如買螢幕就好啦(這是真的...)

通常會被我洗走的,就走了...


但是也有不死心的,回來找我買,不過這種往往都會變成我的好朋友  : )

而且會給他最好的服務與處理。



我想我如果接外包應該也是吧,很抱歉,我老是開這麼機掰的價位。

但是我還是要跟你說,剛好而已啦,別想太多。

2 則留言: