目指せ!iPhoneアプリ開発エキスパート

第7回 応用テクニック

この記事を読むのに必要な時間:およそ 4.5 分

確認ダイアログ

ユーザの操作が本当に正しいかどうか,操作の進行を確認するためにダイアログを表示したい場合があります。そこで登場するのが UIActionSheet と呼ばれるものです。

UIActionSheetを使った確認ダイアログ

UIActionSheetを使った確認ダイアログ

デリゲートの設定

ユーザの操作はアクションを通じて受け取るのが基本です。これまで作成したアクションはすべてInterface Builderを使ってパーツに接続していました。しかしUIActionSheetの作成にはInterface Builderを使いません。そのため,ユーザがダイアログのボタンを押したことを受け取るために「デリゲート」と呼ばれる仕組みを使います。デリゲートの仕組みはObjective-Cを初めたての方には難しい内容ですので,プログラムに慣れてきてから書籍などで学ぶことをおすすめします。

なにはともあれ,早速デリゲートと呼ばれるものを設定してみましょう。UITestViewController.hの @interface から始まる行を,次のように変更します。

@interface UITestViewController : UIViewController <UIActionSheetDelegate> {

このように <UIActionSheetDelegate> を追加することで,UIActionSheetにおけるユーザの操作,すなわちダイアログのボタンを押したということをUIViewControllerの中で受け取ることができるようになります。

ダイアログの表示

ダイアログを表示するために UITestViewController.m を編集します。ここではmyAction1をダイアログが表示されるきっかけのアクションとします。

- (IBAction)myAction1:(id)sender
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"○○しますか?" delegate:self cancelButtonTitle:@"キャンセル" destructiveButtonTitle:@"○○する" otherButtonTitles:nil];
    [actionSheet showInView:self.view];
    [actionSheet release];
}

これでmyAction1が実行された時にダイアログが表示されます。myAction1をラウンドレクトボタンに接続したり,それぞれの文字の部分をいろいろ変更したりして試してみて下さい。

ユーザ操作の受け取り

ダイアログのボタンが押されたことを受け取るためには,次のプログラムをUITestViewController.mに記述します。

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(buttonIndex == 0){

        // destructiveButtonが押された場合の処理

    }
}

destructiveButtonはダイアログの赤いほうのボタンです。ユーザが入力したデータをリセットするなどの処理をここに記述します。

データの保存

テキストフィールドに入力された文字や,プログラム内で扱うデータは,アプリを終了するとすべて消えてしまいます。これを保持しておき,次回アプリ起動時に書き戻したい場合のテクニックを紹介します。

ここで紹介する方法はあくまで簡易的なものです。大量のデータを保持したり,データベースのように扱うのには向いていませんので,あくまで「一時的に文字や数字をとっておきたい」という場合にのみ使用して下さい。

データの保存は,次のメッセージを実行します。

[[NSUserDefaults standardUserDefaults] setObject:myObj forKey:@"myKey"];

myObjに保存したいデータを,myKeyの部分はそれを識別するための任意の文字列(キー)を設定します。

保存したデータを取り出すためには,次のメッセージを実行します。

[[NSUserDefaults standardUserDefaults] valueForKey:@"myKey"];

myKeyで指定したキーで保存されているデータが,myObjに格納されます。

これだけでは少しわかりづらいので,実践してみましょう。

保存と取り出しボタン

保存と取り出しボタン

ラウンドレクトボタンを2つ配置し,それぞれのTouch Downをアクションに接続します。テキストフィールドとラベルにはそれぞれアウトレットを作成して接続しておきます。ここではテキストフィールドのアウトレットを「hozonmoto⁠⁠,ラベルのアウトレットを「toridashisaki」とし,保存のアクションを「myAction1」に,取り出しのアクションを「myAction2」に接続しました。

- (IBAction)myAction1:(id)sender {
    [[NSUserDefaults standardUserDefaults] setObject:[hozonmoto text] forKey:@"test"];
}

- (IBAction)myAction2:(id)sender {
   [toridashisaki setText:[[NSUserDefaults standardUserDefaults]valueForKey:@"test"]];
}

myAction1では,hozonmotoに入力された文字列を取得して,testというキーで保存しています。myAction2では,testというキーで保存されているデータを取り出して,toridashisakiに設定しています。

ビルドして動作を試してみましょう。テキストフィールドに文字を入力し「保存」を押します。その後「取り出し」を押すと保存した文字がラベルに表示されます。

文字列を保存して取り出す

文字列を保存して取り出す

ここでアプリを一旦終了し,再度起動して「取り出し」を押すと,先ほど保存した文字列がラベルに表示されます。

アプリの公開を目指して

今回学んだ内容は,前回ご紹介した「バーゲン教師」「割勘奉行」の機能を満たすために不足している部分を補ったものです。次回はこの2つのアプリの動きについて,実際のプログラムを見ながら,これまでに学習した内容を復習していきます。その後はいよいよApp Storeへの登録です。これまでに学んだことを活かし,App Storeで公開するためのアプリ作りにぜひチャレンジしましょう。

著者プロフィール

皮(かわ)

1980年宮崎県生まれ。納豆好き。

アイフォーンの皮:http://mixi.jp/view_community.pl?id=3531790