現在ある用途のTimerを作っているのだが、相変わらずUI周りでつまずくことが多い。
iOSは素晴らしいUI ToolKitを提供してくれるのだが、それらを実装するには、やはりそこそこ勉強がいる訳である。
以下はとりあえず纏める前のメモ
ModalViewにプロパティを引き渡す際には手抜きしない
TableViewControllerでDetailViewControllerを開く際に、プロパティを引き渡すのに、直接IBOultletなどに書き込まない。
例えば、
などとプロパティを作成し、これらに引き渡す。
@interface ChildViewController : UIViewController
{
IBOutlet UITextfield* textfiledTimerName;
IBOutlet UILabel* labelDuration; // for prototype
IBOutlet UIPickerView* pickerDuration;
int intTimer;
int intTimerIndex;
NSString* stringTimerName;
}
@property ( assign, nonatomic ) int intTimer;
@property ( assign, nonatomic ) int intTimerIndex;
@property ( retain, nonatomic) NSString* stringTimerName;
表示に反映させるためには、
などと使用すればよろしい。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//
textfieldTimerName.text = stringTimerName;
labelDuration.text = [ NSString stringWithFormat: @"%d:%.2d", intTimer / 60, intTimer % 60 ];
}
viewDidLoad or viewDidAppear?
初期設定や、初期画面表示などviewDidLoadに全て実装しがちだが、きちっと分けて実装する。
viewDidLoadはViewControllerがロードされる初回のみ、viewDidAppearはViewControllerがForegroundに表示されるたびに呼び出される。
つまりModalViewを呼び出して、それが閉じた後でもviewDidAppearは呼び出される。
同TabBarViewControllerである。
じゃあviewWillAppear or viewDidAppear?
viewWillAppearに実装するとForegroundに表示される前に反映される。
viewDidAppearに実装すればForegroundに表示された後に反映される、つまり変更されるのが目に見えるのだ。
ViewControllerにNavigation Barや"Back"などのボタンを表示する方法
単純にIBで貼ればよろし、ボタンは"Bar Button Item"、メソッドはボタンにリンクすればよろしい。
PickerViewの実装
PickerViewを実装するためには、IBでViewControllerに貼付けた後に、UIPickerViewDataSource, UIPickerViewDelegateの二つのプロトコルをViewControllerに追加する、上記参照。
あとは必要なメソッドやプロパティを実装すればよい。
大切なものは、以下の通り。
- - (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView、PickerViewの列の数を指定
- - (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component、各列の行数を指定
- - (NSString*) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger) component、各列、各行の表示内容を指定
- - (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component、各列が操作されて止まったときに呼ばれる
- [ PickerView selectRow: (NSInteger) inComponent: (NSInteger) animated: (BOOL) ];、各列の初期値を設定