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有就好)

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

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


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

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



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

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

2012年3月16日 星期五

工程師版本的樂高

 突然的心血來潮,我決定來玩工程師版本的積木!!!



















相信我,鍵盤底下絕對比你想的還要髒很多

通常寫程式我會建議用這種長版的鍵盤,就算是筆電我也是喜歡在接個長鍵盤

畢竟用久了也不會覺得手底下熱熱的

這款是G5的時候的鍵盤,特別去找出純英文字母的,至少保留了按鍵的簡潔感。

我一個按鍵一個按鍵的拆下擦拭

有種打麻將摸牌得感覺....我的Page Down 去哪了...的這種感覺(不過其實我並不會打麻將)


擦著擦著...還讓我 槓 了一把 ...



其實 Apple 自從不在新加坡代工之後,就蠻容易壞了

所以我還蠻愛惜這種舊時代的產物。

請好好愛惜你身邊的舊蘋果



另外無限期徵收外觀良好功能正常的iSight

別問我為什麼要這個東西,這個東西其實不賴,也說不上很好

但是它可以提醒我,Apple不是萬能。這東西就是他曾經失敗的證明

(其實他每個滑鼠都是這種證明...到了magic 這款才好點)

記得他當年很愛拍Mac & PC 的廣告,Mac 一直嘲笑PC 

Well ... PC 要嗆其實也可以很嗆

例如Mac 講了一堆功能的時候 ...PC 接一句:

當年我再稱霸市場的時候,你還在媽媽10圓咧!

Mac 在嘲笑PC 開視訊會議要在頭上綁webcam 

PC不應該轉頭走掉,他應該從他內褲裡面掏出這隻說:那這支啥小???




Apple你別那麼壞,雖然我本來也對蓋茲也沒好感

但是我後來發現,其實他做了許多善事跟捐款

而且重要的一點,他也會寫程式。是不是多了莫名的親切感 ?



我們既然選擇了coding 工程師,就表示我們是要建造東西

如果你選擇當駭客,你的責任就是破壞東西

我覺得駭客沒有錯,只要他的破壞行為不要牽扯到自己本身的利益

他永遠有權力可以破壞,他在告訴你的弱點在哪裡

我也不是鼓勵大家當駭客啦...但是要當駭客真的要當個有水準的駭客

像是X基解密創辦人那樣子。

但是可以當個讓世界更美好的工程師,也是很棒的。

(千萬要小心不要當一個讓別人的生活更美好,可是卻毀了自己生活的工程師)

2012年3月14日 星期三

該怎麼起頭呢...

該怎麼開始 ??

這是很多人都會遇到的第一個問題

萬事起頭難,不是說說,是真的很難

如果我不是一個Programmer 我想我應該會朝音樂或者錄音發展吧

本來...考上中華大學資工系,我爸看了搖搖頭說: 私立大學資工系...有搞頭嗎?

要不要我送你去黑道?(他真的認真的這樣子問我)

我爸:反正...我很多朋友也是當黑道的都可以當立委議員...也是不錯啦,不考慮看看嗎?

總之...我沒去就是了...

大學時期,我真的不喜歡寫程式,因為那時後的程式,怎麼寫充其量就只是電腦螢幕上

一些數據的變化表現,說真的,我一點興趣也沒有。

歸咎於教育也不對,大學時期我的確也學了些東西( F1 ...)

還有Apple ,說真的,那時後影響我的並不是甚麼iphone , iPad那些東西

單純只是一本書

一本講Mac OS Tiger 的書



我買了那本350圓的書,開始了我的人生的Apple Life

那時後我看完書之後,我覺得我要的功能都有,就買吧

最主要的原因是因為Garage Band ,那時後想玩多軌錄音,我想要我可以跟著Background 一起Play 。

我說老爸,我想買台電腦,借我信用卡吧

我爸:喔好啊

我一刷:不多不少 15 " 的Powerbook 外加保固剛好6位數 ...

我爸差點沒暈倒,我還蠻感謝我爸沒說太多,只希望我沒有買錯東西

的確...用鈦合金做筆電的外殼...真的是有點殺雞用牛刀。

現在買一臺鋁合金的15" 效能又強大,也只要六七萬,Apple真的是仁慈許多

Anyway,這就是我的Apple 開端。