テーブルビューを使うまでの手順
iPhoneでよくみるテーブルビュー。
VisualBasicで表とか使おうと思ったら、僕がやってた頃だとサードパーティ製のグリッドを使ったりするのがやりやすかったです。エクセルチックなことが簡単にできて、いろいろイベントを拾ってくれるんで楽ちん。
その時の方法としては、プロパティで指定したりグリッドのデータソースに設定したりすれば勝手に表示をしてくれてたような。
おんなじ気持ちでObjective-Cのテーブルビューを使おうと思ったら、これまた作法が違う。
なんとなく手順がわかってきたので、現時点でのまとめ。
基本の考え:聞かれたら答える
やたら上から目線っぽいけども、イメージはこんな感じ。さっそく手順を。今回はかーなーり基本的な方法っぽいので、より実践的なのは別かも。
ViewにTableViewを配置する
これはもうそのまま。ぺたっと貼るだけ。そしてこのTableViewのコネクションインスペクタにあるdataSourceとdelegateをFile'sOwnerにつなぐ。プログラムから触るのでアウトレットが要りそうなイメージなのだけど、何を表示するのかはTableViewが聞いてくる。「聞かれたら答える」の原則。
コントローラに受け皿をつくる
TableViewを表示するViewのViewController(あぁ、言葉がややこしい)に、TableViewからいつ何時問い合わせされても良いような準備をする。まずはヘッダファイル(.hの方)。Objective-Cでいう2つのプロトコルを指定してあげる。
その2つというのは、UITableViewDelegateとUITableViewDataSourceのこと。
@interface hogeContoroller:UIViewController <UITableViewDelegate,UITableViewDataSource> { NSArray *listData;←この人をTableViewに渡すつもり } @property (nonatmic,retain) NSArray * listData;
TableViewに表示する値と処理を提供しまっせ!宣言ってところかな。
コントローラに処理を書く
ここでやらないといけないのは、次の3つ。
・渡す値を準備する
・何行用意するのか答える
・その行に表示する内容を答える
渡す値を準備する
聞かれる前に準備しとけよ!ってことで、viewDidLoadメソッドで必要な場所から読み込むなりして整形しておく。ここでは、ヘッダファイルで指定したlistDataってのに格納したつもり。
何行用意するのか答える
ここからが本番。TableViewが表示されるにあたり、コントローラに問い合わせが来る。
ここでちょっぴり注意なのは、TableViewは班(=section)行動をしてるってこと。1つだけなら↑でいいのだけど、いくつもsectionが分かれてる場合は、最初にsectionの数を全員周知させないといけない。
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [self.sections count];←セクションの数を返す }
そうすると、それぞれの班長が「で、ウチの班って何人いんの?」(中学生風)と聞きに来る。
それのお問い合わせ窓口がこちらのメソッド。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //この例だとsectionという値で実際に聞き来た班がわかるので、 //sectionをキーにして抽出したり、if文などで必要なデータだけに絞った挙げ句・・・ return [self.sectionData count];←そのセクション用に用意したデータの行数を返す }
ここではreturnのところを適当に書いてますが、実際には表示したい内容に合わせて変更が必要!実際にはセクションごとに数が違うはずなので、その処理は必要です。
その行に表示する内容を答える
TableViewの生徒さんたちはマメです。なんと1人1人が自分の表示内容を聞きに来る。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath)indexPath { //データのなかから該当のものを引っ張り出しておいて・・・ return cell;←1行の中に表示したいものを返す }
もしsectionごとに値を表示したいのなら、こういう感じで班長に伝える。
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { //これまた渡したい値を準備しておいて・・・ return string;←表示したい文字列を返す }
ついでに、インデックスを右側に表示したいときは、学級委員に班名簿(まだこのたとえで押していくか)を渡してあげる。
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { //sectionの見出しに使った配列などを準備して・・・ return array; }
メソッドの名前がやたら長くてよく打ち間違えるのだけど、何を元に何がしたいのかを覚えておけば補完でうまいこといくかな。。
こまごまあって正直面倒くさいけども、自分で好きにできるので融通は効きやすげ。