絶対に挫折しないiPhoneアプリ開発入門Part.23 ~Storyboardでアクションシート&配列処理~

前回:絶対に挫折しないiPhoneアプリ開発入門Part.22 ~UIDatePickerで日付や時刻を表示しよう~




今回はアクションシートを出して処理してみましょう。

こんな感じですね。

「注意」を押したらラベルに「注意」、「処理1」を押したらラベルに「処理1」、「処理2」を押したらラベルに「処理2」と表示するようにします。ラベルに文字を表示させるのは、アクションシートのボタン処理がどうなっているか明確にするためです。



ではまずSingleViewApplicationからスタートし、Storyboardを使いましょう。プロジェクトの名前は「ActionSheet」としてみました。






最初に、ボタンとラベルを設置します。



設置したボタンとラベルをファイルに紐付けします。右クリックを押しながらドラッグですね。controlキーを押しながらでもOKです。ボタンのほうは、直接ダブルクリックをして「アクションシートを出す」とあらかじめ文字をいれておきました。そしてボタンを押したらアクションシートが出る仕組みにするので、ファイルに紐付けした際には「Action」を選択してくださいね。「Outlet」じゃないですよ〜。一方、ラベルのほうは文字を表示するだけなので「Outlet」、名前は「label」としてみました。そのまんまな感じです。


これで準備はできました。処理を書いていきましょう。

UIActionSheetを使うときには、hファイルでを追加する必要があります。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIActionSheetDelegate> //←これを追加してください

- (IBAction)tap:(id)sender;
@property (strong, nonatomic) IBOutlet UILabel *label;
@end


では、mファイルを実装しましょう。(丸で囲んだ数字は文字化けしてしまうので、普通に「1」「2」と記述しました。戸惑わないでください



まずはIBActionの処理を書きましょう。
ViewController.m

- (IBAction)tap:(id)sender {
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"アクションシートが出ました" delegate:self cancelButtonTitle:@"キャンセル" destructiveButtonTitle:@"注意" otherButtonTitles:@"処理1",@"処理2", nil];
    [actionSheet showInView:self.view];
}
  • タイトル:initWithTitle
  • キャンセルボタン:cancelButtonTitle
  • 「要注意」してほしい赤いボタン:destructiveButtonTitle
  • その他の普通のボタン:otherButtonTitles

なんとなく見れば分かると思います。

otherButtonTitlesでボタンを増やすためには、たとえば「otherButtonTitles:@"処理1",@"処理2", @"処理3",nil」とします。nilを忘れないようにしてください

アクションシートをつくっただけでは表示させることができません。
上記のように[actionSheet showInView:self.view]によって表示させてくださいね。



次に、「注意」と書かれたアクションシートのボタンなどが押された時、どういう処理をするのかを書いていきます。

これにはメソッド- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndexを追加する必要があります。あらかじめテンプレートにはのっていないので、自分で書いてつくる必要があります。IBActionの下の方にでも記述してください。

- (IBAction)tap:(id)sender {
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"アクションシートが出ました" delegate:self cancelButtonTitle:@"キャンセル" destructiveButtonTitle:@"注意" otherButtonTitles:@"処理①",@"処理②", nil];
    [actionSheet showInView:self.view];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{  //←この処理を追加
    NSArray *array = [[NSArray alloc] initWithObjects:@"注意",@"処理1",@"処理2", nil];
    for (int i = 0; i < [array count]; i++) {
        if (buttonIndex == i) {
            label.text = [array objectAtIndex:i];
        }
    }
}


キャンセルボタンをのぞき、今回はボタンが3つあります。

  • 0番目:「注意」
  • 1番目:「処理1」
  • 2番目:「処理2」

となります。上から順番です。これが「buttonIndex」ですね。
ラベルには同じ文字を表示させようと思うのでarrayという配列を作成し、文字列を3つ格納してみました。

たとえば、buttonIndex == 0 のときには「注意」とラベルに表示してもらいたいということですね。
配列の要素にアクセスするようにコードを書いてみました。

forループさせて、いつまでforループさせるかというと、配列の要素がつきるまでです。
配列の要素数を整数で返してくれるのがcountです。今回は[array count]でarrayという配列の要素数、すなわち「3」を返してくれるわけです。

配列の要素にアクセスし、その要素を返してくれるのが[array objectAtIndex:i]です。
たとえば[array objectAtIndex:0]の場合、arrayの0番目にアクセスしているので、「注意」という文字列を返します。



以上がコードの説明です。

できましたでしょうか?



======================
当ブログ管理人のツイッターこちら
◎フォローしてくださると泣いて喜びます!ツイッター上で当ブログの質問などにもできるだけお答えしますし、役に立つiPhoneアプリ開発情報もつぶやきます。個人的なご依頼(たとえば、プログラミングの家庭教師、Skypeレッスンをしてくれないか、iPhoneアプリ開発の勉強会ってやってるの、とかですね)でもかまいません。
スカイプレッスンについて
開発をしているとその都度ぶつかる問題があると思いますが、検索で調べてもなかなかわからない、あるいは調べても非常に時間がかかる場合があると思います。開発者のみなさんもお忙しいと思いますので、私のレッスンを受けながら開発を進めていただけると、大幅にお時間を短縮できます。加えて、iPhoneアプリ開発の基礎、応用が身につき、今後の開発もスムーズに進められます

お問い合わせはツイッター、またはhiyoshimarukoアットマークgmail.comまでお願いします。(アットマークを@にしてください)お待ちしております!