[iOS]StoryboardでTODOリストアプリを作ろう(2/3) TODO項目の入力画面とカスタムクラスの作成編

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「Storyboardで始めるiPhoneアプリ開発シリーズ」の第四回目になります。
前回の「[iOS]StoryboardでTODOリストアプリを作ろう(1/3) 準備編 MasterDetailApplicationとUITableViewについて」に引き続き、TODOリストアプリの開発を進めていきます。今回はアプリに必要なオブジェクトを追加するところからはじめていきます。

必要なオブジェクトを追加する

追加ボタンを追加する

Xcode画面左側のファイル一覧からMainStoryboard.storyboardファイルを選択してMainStoryboard.storyboardファイルを表示させます。

Storyboard上で追加ボタンを追加します。
右側のオブジェクト一覧からBar Burron ItemをMasterシーンのNavigationBarに追加します。
intro-storybord3-14

追加したボタンを選択した状態で、画面右にattributes inspectorを表示させ、ボタンの種類を変更します。identifier項目をクリックし、Addを選択します。
intro-storybord3-15

追加ボタンに変更されました。ついでにNavigationBarのタイトルを、MasterからTODOへ変更します。(タイトルをダブルクリックすると編集できます)
今後、この画面をメイン画面と呼ぶことにします。
intro-storybord3-16

入力画面用のTableViewControllerを追加する

次に入力画面を追加します。入力画面はTableViewを使い、CellはStaticCellを選択することにします。
StaticCellを使うにはTableViewControllerを使わなければならないので、TableViewControllerを追加します。
TableViewControllerはUIViewControllerの機能を継承し、UITableViewを元から持っているViewControllerです。

画面右のオブジェクト一覧から、TableViewControllerを追加します。
intro-storybord3-17

次にメイン画面の追加ボタンを押すとmodalセグエで入力画面へ遷移するように設定します。
controlキーを押しながら追加ボタンをTableViewControllerまでドラッグし、ドロップします。メニューが出てくるのでmodalを選択します。
intro-storybord3-18

次に追加したTableViewControllerにNavigationControllerを追加します。
TableViewControllerを選択した状態で、Xcodeメニューの「Editer」→「Embed In」→「NavigationController」を選択し、NavigationControllerを追加します。
intro-storybord3-19
NavigationControllerが追加されました。

入力画面の要素を作成

TableViewのContentを変更する

入力画面を作っていきます。
先ほど追加したTableViewControllerのTableViewをクリックしてTableViewを選択状態にします。
intro-storybord3-20

attributes inspectorのContent項目をクリックし、Static Cellsを選択します。
intro-storybord3-21

StaticCellに変更されました。
TableView部分の表示もPrototype ContentからStatic Contentに変わりました。
intro-storybord3-22

TableViewのスタイルを変更とCellの内容の調整を行う

次にTableViewのスタイルをGroupedに変更します。
attributes inspectorStyle項目をクリックし、Groupedを選択します。
intro-storybord3-23

スタイルがGroupedに変更されました。
今回作る入力画面では、セルを1つだけ使うので、不要なセルを削除します。
2行目のセルをクリックして選択した後にdeleteキーを押してセルを削除します。
同様にあとひとつセルを削除してセルが1つになるようにします。
intro-storybord3-24

セルが1つになりました。
文字入力用のUI部品を追加します。
右側のオブジェクト一覧からText Fieldを、Cellのところまでドラッグします。
intro-storybord3-25

追加したTextFieldの幅を調整します。
下の画像くらいのサイズに変更します。
intro-storybord3-25-2

次にTextFieldの見た目を変更します。デフォルトではシャドウのついたTextFieldになっていますが、何もついていないタイプのTextFieldに変更します。
BorderStyle項目の中の一番左のタイプを選択します。
intro-storybord3-26

NavigatinBarにボタンを追加する

次にNavigatinBarにcancelボタンsaveボタンを追加します。
右側のオブジェクト一覧からBar Button Itemを、NavigationBarへドラッグします。左端と右端に1つずつ追加します。
intro-storybord3-27

Bar Button Itemが2つ追加されました。cancelとsaveボタンは用意されているので、それに変更します。

右側のボタンを選択した状態でattributes inspectorIdentifer項目のコンボボックスの中からSaveを選択します。
左側のボタンも同様の操作でタイトルをcancelに変更します。
intro-storybord3-28

変更できました。
intro-storybord3-29

カスタムクラスの作成

cancelとsaveボタンの追加は完了しましたが、このままではボタンを押しても何も起きません。

saveボタンとcancelボタンそれぞれ押した時の動作は以下のようになるようにします。

  1. saveボタンを押すと、TextFieldに入力された文字列をメイン画面に渡す。入力画面を閉じてメイン画面に戻る。メイン画面に戻るとメイン画面にTODO項目が追加されている。
  2. cancelボタンを押すと、入力画面を閉じてメイン画面に戻る。メイン画面に戻ってもメイン画面に変化はない。

入力画面を選択した状態でIdentity inspectorを見ると、UITableViewControllerクラスが割り当ててあります。
ボタンを押したことを検知し、それをメイン画面に伝えためのコードを追加したいので、UITableViewControllerを継承したクラスを作成します。
intro-storybord3-30

クラスファイルの作成

左側のファイル一覧のTodoListSampleグループを右クリックしてNew File…を選択します。
intro-storybord3-31

Objective-C classを選択してNextをクリックします。
intro-storybord3-32

ClassはAddItemViewControllerSubclass ofはUITableViewControllerにします。
また、その下の項目にはチェックを入れず、「Next」をクリックします。
intro-storybord3-33

保存場所を選択しCreateをクリックします。
intro-storybord3-34

AddItemViewController.hAddItemViewController.mファイルが作成されました。
intro-storybord3-35

作成したクラスを入力画面へ割り当てる

次にStoryboard上で入力画面にAddItemViewControllerを割り当てます。
Storyboardを表示し、入力画面を選択し、Identity inspectorClass項目AddItemViewControllerと入力します。
intro-storybord3-36
入力画面にAddItemViewControllerを割り当てることができました。

TableViewまわりのコードを修正

画面右上のViewの右端のボタンを押してユーティリティエリアを非表示にします。
intro-storybord3-37

入力画面を選択した状態で、Editorの真ん中のボタンを押してアシスタントエディタを表示します。
intro-storybord3-38

AddItemViewController.hが表示されるので、AddItemViewController.mファイルの方を選択します。
intro-storybord3-39

AddItemViewController.mファイルが表示されました。これからコードを編集していきます。

warningが2箇所出ているかと思います。
この二箇所はTableViewのセクション数や行数を指定するメソッドですが、数の指定が0になっているのでwarningが出ています。
intro-storybord3-40-2

#pragma mark - Table view data source行より下の3つのメソッドの役割は以下のようになっています。

メソッド名 内容
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView TableViewのセクション数を指定する
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section セクション内の行数を指定する
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath セルの内容を指定する

入力画面の行数/セクション数/セルの内容はStoryboard側で指定しているので、これらのメソッドは不要です。

下の画像のように3つのメソッドを選択して、commandキーを押しながら/キーを押し、コメントアウトします。
intro-storybord3-41

コメントアウトされwarningが消えました。
intro-storybord3-42

ボタンのアクションハンドラの追加とTextFieldの登録

AddItemViewController.mファイルにアクションハンドラを追加する

ボタンが押された等のイベント発生時に呼ばれるメソッドであるアクションハンドラを実装していきます。SaveボタンとCancelボタンそれぞれに対して1つずつ作ります。
Saveボタンcontrolキーを押しながらクリックし- (void)viewDidLoadの上までドラッグし、ドロップします。
intro-storybord3-43

入力画面が出てくるので、Name項目にclickedSaveButtonと入力しConnectをクリックします。
ここで入力した名前がsaveボタンが押された時に呼ばれるメソッド(アクションハンドラ)の名前になります。
intro-storybord3-44

追加できました。
intro-storybord3-45

Cancelボタン用のアクションハンドラも同様のやり方で追加します。
メソッド名はclickedCancelButtonにし、- (IBAction)clickedSaveButton:メソッドの下に追加します。
追加後は下のようになります。
intro-storybord3-46

また、今追加したメソッドが呼ばれた時にログが出力されるようにします。
以下のようにNSLog()関数を追加します。NSLog()関数はプログラムの実行結果を確認するために使います。
@""で囲まれた部分が、ログ出力用の画面に出力されます。

- (IBAction)clickedSaveButton:(id)sender
{
    NSLog(@"clickedSaveButton");
}

- (IBAction)clickedCancelButton:(id)sender
{
    NSLog(@"clickedCancelButton");
}

追加したメソッドの動きを確認する

ここでRunボタンをクリックしてアプリを実行してみます。
メイン画面で追加ボタンをタップして、入力画面に遷移させ、saveボタンcancelボタンを押してみます。
intro-storybord3-48

saveボタンを押せばclickedSaveButtonがcancelボタンを押せばclickedCancelButtonというログが、画面下部のデバッグエリアに表示されると思います。
intro-storybord3-47

(デバッグエリアが表示されない場合はXcode画面右上のViewの真ん中のボタンを押してデバッグエリアを表示してください。)
intro-storybord3-64

ボタンを押した際に、先ほど追加したclickedSaveButtonメソッドやclickedCancelButtonメソッドが呼ばれることが確認できました。
Stopボタンを押してアプリの実行を止めて、編集に戻ります。

AddItemViewControllerにTextFieldを登録する。

Storyboard上で入力画面に追加したTextFieldに入力された文字列を取得して、メイン画面に渡す必要がありますが、
そのためにはAddItemViewControllerクラスにTextFieldを登録する必要があります。

MainStoryboard.storyboardファイルを表示させ、
ボタンのアクションハンドラを追加した時と同様に、TextFieldcontrolキーを押しながらAddItemViewController.mファイルまでドラッグしてドロップします。
下の図のように@interface AddItemViewController ()行と@endの間に追加します。
intro-storybord3-49

メニューが出てくるので、NameはtextLabelと入力します。
intro-storybord3-50

追加できました。
intro-storybord3-51

まとめ

今回はTODO項目を入力する画面を作りました。次回は入力した文字列をメイン画面に渡す処理を実装し、TODOアプリを完成させます。