タイトルが雑なので変更 さぁ、少しずつ実用的なサンプルに入ってきた。
■アクションシートデリゲート(UIActionSheetDelegate) アクションシート(UIActionSheet)は、2つ以上のアクションを選択して処理するためのクラス どれかを選択しないと次へ進めない、モーダルダイアログみたいなものですかね?
まず、UIActionSheetにDelegateするための宣言
@interface UntitledViewController : UIViewController
{
IBOutlet UILabel *statusText;
IBOutlet UITextField *nameField;
IBOutlet UITextField *numberField;
}
■アクションシート実装
-(IBAction) buttonPressed:(id)sender {
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"Are You Sure?"
delegate: self
cancelButtonTitle:@"No Way!"
destructiveButtonTitle:@"Yes, I'm Sure"
otherButtonTitles:nil
];
[actionSheet showInView:self.view];
[actionSheet release];
}
・UIActionSheetオブジェクトを初期化 ・initWithTitle:アクションシートのタイトル ・delegate:自分自身を受け渡す事で、後に関連メソッドを自動呼出 ・cancelButtonTitle:キャンセルボタンラベル ・destructiveButtonTitle:OKボタンラベル ・otherButton:複数のボタンを追加できる(カンマ区切り) ・actionSheetのshowInViewを呼び出す ※self.viewがドットシンタックスなのは、viewがプライベートインスタンスだから
次にアクションシートが消えた時に通知する処理(actionSheet didDismissWithButtonIndex)
-(void) actionSheet:(UIActionSheet *)actionSheet
didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex != [actionSheet cancelButtonIndex]) {
NSString *msg = nil;
if (nameField.text.length > 0) {
msg = [[NSString alloc]
initWithFormat:@"You can breathe easy, %@, evetything went OK.",
nameField.text];
} else {
msg = @"You can breathe easy, everything went OK.";
}
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Something was Done"
message:msg
delegate:self
cancelButtonTitle:@"Phew!"
otherButtonTitles:nil
];
[alert show];
[alert release];
[msg release];
}
}
UIActionSheetクラスのソースを見てみると、まんまインターフェイスで定義されていて、お約束のデリゲートメソッドらしいが、構文がイマイチ???
・ -(void) actionSheet:(UIActionSheet *) actionSheet = actionSheet(引数)
・didDismissWithButtonIndex:(NSInteger)buttonIndex = didDismissWithButtonIndex(引数)
として、Java風に言えばこんな感じなのか?
actionSheet(引数).didDismissWithButtonIndex(引数)
ちなみに、力技の確認方法ですが「(void) actionSheet」と「didDismissWithButtonIndex」 の名称を変更すると動作しません。 よって「actionSheet.didDismissWithButtonIndex」が自動的に呼ばれているということ。
メッセージメソッドからしても、 ・「半角スペース = ドットシンタックスもしくは引数カンマ」 ・「コロン = 引数()」 ・「() = 型」
と考えれば、基本的にコード解読がしやすいと思われ。 ただ、1つ腑に落ちないのはこの書き方
(UIActionSheet *) actionSheet
このアスタリスクは何なの???と疑問に思っていたが、メソッドの引数型の決まりみたいね。
(返り値型)メソッド:(引数型 *)引数
前にも書いたけど、idだけは例外でアスタリスクはつけなくてもいい。 あとは「半角スペース」で繋げていく感じ。
うーん、メッソドの書き方は少しずつ見えてきたかな? 番外で、アクションシートについての実装の仕方がYoutubeにありました(^^) iPhone SDK Knigge - 2.1 - UIActionSheetDelegate (Deutsch)
いやぁ、こういう風にするとわかりやすいね。 オイラもObjective-Cにマスターになれば、やってみたいけどw