Objective-C 基礎編 Vol6

2010/05/11

タイトルが雑なので変更 さぁ、少しずつ実用的なサンプルに入ってきた。

■アクションシートデリゲート(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