ToDoリストiPhoneアプリを作成してみよう(Part2)

みなさんこんにちは。Yuta Fujii(@HofuCamera)です。

前回に引き続き「ToDoリストiPhoneアプリ(Part2)」を開発していきたいと思います。
Part2では、前回説明した手順を元に、ToDoの情報をアプリ内に保存するというところまで行っていきたいと思います。これが今回のゴールです。

《前回までの講座》


iPhoneアプリ開発の環境を整えよう
iPhoneアプリ開発に必要なこと
プログラムなしで、 レッドカードiPhoneアプリを開発してみよう
プログラムなしで、カラフルカードアプリを開発してみよう
お気に入りのサイト集アプリを開発してみよう
ノートメールアプリを開発してみよう(Part1)
ノートメールアプリを開発してみよう(Part2)
10秒で止める「ジャストタイムiPhoneアプリ」を開発してみよう(Part1)
10秒ジャストで止めるゲーム、ジャストタイムアプリを開発してみよう(Part2)
嘘電話アプリを開発してみよう
パスワードiPhoneアプリ作成してみよう(Part1)
パスワードiPhoneアプリ作成してみよう(Part2)
ToDoリストiPhoneアプリを作成してみよう(Part1)


InputViewControllerを操作する

それでは始めていきたいと思います。

現在▶ボタンを押してアプリを起動すると、はじめに出てくる画面の右上に+ボタンがあるかと思います。

この+ボタンを押した先でデータをアプリ内に保存していくことになるので、InputViewController.mを編集していくことになります。

それではMain.storyboardを開いて、画面をクリックしたあと、右上の赤い部分を選択し、プログラムを見れるようにします。
xcode_part2_2

宣言

まず、それぞれ必要な要素を宣言します。
上からアプリ内に保存する際に使用するもの、タイトルを格納する配列(タンス)、本文を格納する配列(タンス)、日付を格納する配列(タンス)になります。
xcode_part2_3

    NSUserDefaults *ud;
    
    NSMutableArray *titleArray;
    
    NSMutableArray *sentenceArray;
    
    NSMutableArray *dateArray;

配列の保存について

次に、保存ボタンを作成しましょう。
右側からいつものように、Buttonをドラッグ&ドロップして画面へのせ、ボタンを選択した状態でキーボードのcommandを押しながら、プログラム側へドラッグ&ドロップします。

xcode_part2_4
そして、ここではこのボタンが押されたときに反応する場所のメソッド名をsaveとします。
xcode_part2_5
さらに、先ほど宣言したもののうち、dateArray以外を初期化します。
xcode_part2_6

    titleArray = [[NSMutableArray alloc] init];
    
    sentenceArray = [[NSMutableArray alloc] init];

    ud = [NSUserDefaults standardUserDefaults];

次に、それぞれタイトルと本文に記載されたときの条件分岐を書いていきましょう。
ここでは、タイトルまたは本文が空であれば、何もしないということをまず先に記載します。
xcode_part2_7


 if ([inputTitle.text isEqualToString:@""]||[inputText.text isEqualToString:@""]) {
        
        //空の場合は何もしない
        
        
    }

保存されてあるものを取り出す

次に、そのすぐ下に「そうでなければ」の部分を記載していきます。
手順としては、まずアプリ内に保存されているタイトル(title)、本文(sentence)がそれぞれ入っている配列を取り出します。

そして、 配列に入っている文字列の数だけ全てobjectという文字列を入れる変数へ入れて、同時にtitleArray(タイトルを入れておく配列)とsentenceArray(本文を入れる配列)へいれてあげます。

xcode_part2_8

        //取り出し
        NSArray* array1 = [ud arrayForKey:@"title"];
        for ( NSString* object in array1 ) {
            [titleArray addObject:object];
        }
        
        
        NSArray* array2 = [ud arrayForKey:@"sentence"];
        for ( NSString* object in array2 ) {
            [sentenceArray addObject:object];
        }

そして、アプリ内に入っていた文字列の入った配列に新しく今から入力する文字列を入れるという作業を行います。
xcode_part2_10

 //保存
        [titleArray addObject:inputTitle.text];
        [sentenceArray addObject:inputText.text];

最後に、タイトルのキー値をtitle、本文のキー値をsentenceとして配列をアプリ内へ保存します。
同時にログを出して、中へちゃんと保存されているかを確認してみます。
xcode_part2_11

//保存
        [ud setObject:titleArray forKey:@"title"];
        [ud setObject:sentenceArray forKey:@"sentence"];

NSLog(@"タイトル %@",[ud arrayForKey:@"title"]);
NSLog(@"本文  %@",[ud arrayForKey:@"sentence"]);

ログは下部に出現し、主に変数の中身などを確認することができます。
今回はtitleというキー値とsentenceというキー値で保存されているものの中身を見ています。
また、処理が終わったらこの画面自体を閉じたいので、


[self dismissViewControllerAnimated:YES completion:nil];

と記述します。

xcode_part2_12

キーボードを閉じる

最後に、画面タッチをするとキーボードが閉じるようにしたいので、以下のように書きます。
xcode_part2_13


// タッチイベントを取る
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    [inputTitle resignFirstResponder];
    [inputText resignFirstResponder];
    
}

以上で保存ができているか確認したいと思います。

シミュレーターで確認してみよう

それでは、左上の▶ボタンを押して、シミュレーターで確認して見ましょう。
まず、+ボタンを押します。
xcode_part2_14
次にタイトルと本文へ適当な文字を入れて登録ボタンを押してみます。
xcode_part2_15
すると、画面下部の赤い部分に今登録した文字列がログとして確認できることがわかると思います。
xcode_part2_16
さらに文字を入れてみます。
xcode_part2_17
保存されている文字列が増えたことがわかるかと思います。xcode_part2_18

最後に

いかがでしたか?

今回はデータを配列として保存するということを行いました。次回は、保存したデータを実際に取り出してみて反映してみたいと思います。

そして、保存するデータに現在時刻も追加します。このように、NSUserDefaultsは小さなデータであれば簡単に保存できます。

iPhoneのデータ保存形式にはさまざまありますが、そのことについてものちのちみていきたいと思います。本日は以上です!