03a - Drag Multiple Views Persistant

iPhone SDK開發範例大全第二章之三(3/14):2009年08月24日星期一

iPhone SDK開發範例大全即iPhone Developer's CookBook的中文譯本,程式可由erica網站下載。第二章講View(視圖),程式共有十四個:

本文講第三個程式03a -DragMultipleViewsPersistant:

(A)這個程式會顯示16朵不同顏色的花在iPhone螢幕,並且可以移動每一朵花,與iPhone SDK開發範例大全第二章之二(2/14) ( iPhone blog版 )、03a -DragMultipleViews幾乎相同,唯一的一點不同是,下一次再進入03a -DragMultipleViewsPersistant時,上一次移動完畢的花會在其最後的位置,也就是會persistant --- 殘留。見下圖,這就是第二次run,15朵花排得好好的,一朵在上方,明顯的,這保留了第一次run的結果。

(B)如何能做到persistant --- 殘留?見下圖程式大綱。重要的是:

第七行 ,NSString *whichFlower;:這個instance variable儲存著各朵花來自何file。未來將由updateDefults放到disk上當做下一次run的user defaults.

第59行, -(void) updateDefaults:這個method在程式結束時會被call,被誰call?被applicationWiiTerminate call。

第135行,[hello updateDefaults];:這一行在applicationWiiTerminate,負責將目前的畫面儲存下來,下一次run時,將由這個畫面開始。

(C)詳細看updateDefaults,見下圖,重要的行都有英文comment。

第64~68行的for loop:將每一朵花的 file name放在colors NSMutableArray內,將frame放左locs NSMutableArray內。

第72行:將( key = "colors", value = colors NSmutableArray object )放入NSUserDefaults object內。

第76行:將( key = "locs", value = locs NSmutableArray object )放入NSUserDefaults object內。

第77行:將NSUserDefaults object寫到disk上。synchronize method的功能就是sync memory及disk。

(D)當updateDefaults將NSUserDefaults放上disk後,下一次run時,loadView會將其load上螢幕,見下圖,

第97,98行:將disk上的NSUserDefaults load進colors, locs這兩個NSMutableArray pointer。

第101~109行:若locs有上次run殘留的frame,就用這frame,否則找個64x64、random位置的frame,assign進DragView dragger。

第111~114行: 若colors有上次run殘留的flower file name,就用這file,否則從blueFlower.png、pinkFlower.png、orageFlower.png三個中randon找一個file name,assign進DragView dragger。

第116行:加入一朵花的subView。

(E)所以,就由drawView裡的第七行 ,NSString *whichFlower;、updateDefaults、loadView三者合作完成了03a -DragMultipleViewsPersistant--- 殘留。

注意:DragView Class內initWithFrame裡有一行self.userInteractionEnabled = Yes;是必要的,因DragView Class是UIImageView的subclass,UIImageView是UIView的subclass,UIImageView的userInteractionEnabled的default是NO,故需設為YES。(不可去看UIView的default是YES的userInteractionEnabled,因為UIImageView overwrite UIView)。