這次是寫iPhone/iPad通用程式,加上旋轉功能,加上手勢辯識還有存檔。
iPhone的程式大多是點一個功能,把新的View push進NavigationViewController裡。iPad的程式則是用SplitViewController分成master/detail view。橫擺的時候就兩個都秀出來,直擺的時候只秀出detail view。兩個分開來寫還好,但是要寫成同一個程式動態判斷主機自動改顯示方法,就很頭大。常常寫到iPhone下看OK了,iPad下又爛掉了。難怪有些程式是iPad/iPhone分開賣。
iPad的這種主從介面,iOS framework全自動幫你調版面就很方面。iPhone的直擺橫版,原本以為只是差在一個View,舊的free掉再開一個新的用指標去指就好了。沒想到看了看文件,View在Controller初始化的時候就被綁死了,不然就是要用純寫程式碼的方式去畫圖形介面…當然不會那麼無聊去用第二個作法,不過看了第一個做法問題就是,為了一個新的View,要把現在的Controller丟掉,那不是本末倒置?後來查到了一種作法,程式一進去都是讀直放View,如果偵測到手機變橫放,用NavigationViewController push進一個新的Controller,同時去綁橫放的View;偵測到變回直放,就把NavigationViewController裡最上面的pop掉…跟據作者說,safari也是這樣寫,所以就算你的手機一開始就是橫放,進去程式也會先看到他是直放才又馬上換成橫放。不過說起來很好懂寫起來也是蠻麻煩的,所以就跳過不做了 XD
另外這次寫才發現,原來iPhone也是支援四個方向的,而且同樣比列畫面的狀況是一模一樣,只要加一行code就好了,不知道為什麼之前玩到的有些程式只支援home鍵在下和逆時鐘轉90度,另外兩個卻不行??
手勢辯識意外的簡單,iOS framework都幫你搞好了,只要把他幫你算好的值拿來用就好。存檔的話,iOS有一個NSUserDefault非常簡單,用起來就像C++ STL的map,而且如果你的變數存成結構包結構的樣子,不管被包的結構多複雜,存讀都是一行就搞定了。問題就是存放的code要放哪裡。跟據Apple人機介面指南,進入程式要和上次離開程式的狀態一模一樣,但是我的程式的狀態是散佈在各個物件,而且有些時候某些物件還沒有被實體化,寫到最後還是不知道要怎麼把存檔的程式碼集中在某個地方寫??
另外寫Object C寫到現在,覺得有幾個特點還不錯。
- 有selector,可以把method的名字當變數去傳
- 可以問物件支不支援某method
- 所有物件指標都支援null object,呼叫method不用像C/C++要先檢查ptr!=null
- 所有的物件都支援reference count,雖然不如Java自動回收來的無腦,但是用習慣就覺得很好用
- 寫prive method不用寫在.h裡
- C的語法完全保留
不過相對應的我覺得Xcode不是那麼好上手
- 初始的debug介面是組語,gdb,source code,stack,變數監視區全部散開的視窗
- debug時呼叫method,按下一步常常就跳到組語畫面…為什麼不能停在最後出錯的原始碼?
- 要看是在哪裡出錯要看debug console的call stack是在哪裡丟出exception,但是這個東西預設沒有開…= =
- debug模式下,預設幫忙reference count debug的NSZombineEnabled沒有打開
- debug模式結式不會自動跳回打程式碼的模式
- 內建的版本控制看不懂怎麼用,Xcode 4的版本控制改成類似OS X Time Machine的使用方法,應該會比較好用
還有一點就是,寫GUI的程式,要輸入test input還要一個一個點就很麻煩,這時候才發現sikuli的好用,難怪sikuli的論文都是以全自動GUI測試為賣點…



沒有留言:
張貼留言