2010年9月16日木曜日

Day5 Count Me In

アプリの内容:
「+」ボタンと「ー」ボタン、数字が表示されたラベルが用意されている。
1回押すごとにラベルに表示された数字がインクリメント/デクリメントする。

実装:
View にUIButton とUILabel を追加する。
UILabel に表示する数字をインクリメント/デクリメントするメソッドを実装する。

ボタンアクション:
addTarget:action:forControlEvents: で、アクションとターゲットを追加する。
addTarget:action:forControlEvents:
Adds a target and action for a particular event (or events) to an internal dispatch table.

Control Events には、様々なイベントが用意されている。
今回の「ボタンを押す」アクションは、「UIControlEventTouchUpInside」を選択する。
UIControlEventTouchUpInside
A touch-up event in the control where the finger is inside the bounds of the control.

最初、特に理由もなく「UIControlEventAllEvents」を選択していたら、なぜかアクションに指定したメソッドが2回呼ばれてしまった。レファレンスを読むと、
UIControlEventAllEvents
All events, including system events.

と、あるのでシステムイベントでも呼ばれていたのだと思う。適当に選択するのはやめろ。

UILabel に表示する数字をインクリメント/デクリメントするメソッド:

以下のように実装した。

-(void)addUnit{
 NSString* numValue = [[NSString alloc] initWithFormat:@"%d", ++count];

 contLabel.text = numValue;
 [numValue release];
}

-(void)subtractUnit{
 if(count <= 0) return;
 NSString* numValue = [[NSString alloc] initWithFormat:@"%d", --count];
 
 contLabel.text = numValue;
 [numValue release];
}
チュートリアルでは、インクリメント/デクリメント演算子が後置されていたが、それではボタンを1回押しただけでは目的が達成されないので前値に直した。
インクリメント C言語、C++、Java、JavaScriptなどでは、インクリメント演算子「++」が用意されている。厳密には、前置インクリメントと後置インクリメントの2種類の演算子があり、演算子記号は同じ「++」だがオペランドの前に置くか(例: ++x)後に置くか(例: x++)で区別される。前置インクリメントは式の評価の最初にオペランドがインクリメントされ、後置インクリメントは最後にインクリメントされる。
参考サイト: UIControl Class Refarence 、 インクリメント