UITableViewのセクションヘッダをStoryboardで作る時の参考
公開日:
:
最終更新日:2014/03/16
Tips Storyboard, UITableView, UITableViewCell
UITableViewのセクションヘッダをカスタムして作る際に、セルと同様にプロトタイピングするための記事。
UITableViewCell.contentViewはUIViewなんだから、それを使えばいいという趣旨。
(1)Storyboardで通常のセルと同様にセルを作る。[Style]はCustom、識別用の[Identifier]も入れる。
通常のヘッダ同様に背景色を透過させたい場合はViewのbackgroundColorは透明色(アルファを0)に指定する。
(2)ヘッダービュー(またはフッタービュー)を返すUITableViewDataSourceデリゲートのメソッド
-(UIView*)tableView:(UITableView)tableView viewForHeaderInSection:(NSInteger)section;
-(UIView*)tableView:(UITableView)tableView viewForFooterInSection:(NSInteger)section;
を実装するときに、(1)で作ったセルを
[tableView dequeueReusableCellWithIdentifier:]
で呼び出す(IndexPathの指定が不要な方を使う)。
(3)手順(2)で呼び出したセル(UITableViewCell)のcontentViewが、storyboardで設定した(セル扱いの)viewの本体なので、適宜セクション情報に合わせて内容を設定するなどして、contentViewをreturnしてやる。
contentViewの下にあるコンポーネントの特定は、storyboard上でコンポーネントにtagを設定してviewWithTagメソッドで呼び出すのが楽。
ただ、tagの数値で呼び出すのはぱっと見で分からないし、定数宣言するのはそれはそれで面倒という話であれば、別の手段を取る事もできる。
(1)UITableViewCell派生クラスを1つ作る。これをmyTableViewCellとする。
(2)myTableViewCellにIBOutletのプロパティを用意する。
(3)UIをIBで作りたい場合、Emptyのxibを用意してFile’sOwnerをmyTableViewCellにし、UITableViewCell(下の画像のアイコンのコンポーネント)を置く。
File’sOwnerのviewにこのTableViewCellを接続。他のIBOutletも配置して接続(下の画像のアイコン)。
(4)使いたいUITableViewのあるViewControllerの適当な所(viewDidLoadとか)で、対象のtableViewに対して登録を行う。
UINib *nib = [UINib nibWithNibName:@“[手順(3)で作ったxibファイルのファイル名]" bundle:nil]; [tableView registerNib:nib forCellReuseIdentifier:@“[適当な識別名]"]
あとはStoryboardで通常のセルと同様にセルを作ったのと同様にdequeueReusableCellWithIdentifierで呼び出せる。
この場合、呼び出したセルは(myTableViewCell*)でキャストしてやれば、プロパティにもアクセスできる。
これらのセクションヘッダ/フッタにボタンなどを配置した時など、タップされたsectionのボタンが呼ばれたのかの区別をつけたい場合があるが、
その場合はreturnするViewそのものにsectionがわかるようにtagをつけるとよい。sender.superview.tagでアクセスできる。
UITableViewCellになってるが、このクラスはUIView派生クラスなので、そのままreturnしても全然問題ない。ここらへんが目鱗だった。
※追記:実際はContentViewを返したほうが背景色透過ができてよい
Cellに乗っけたヘッダ/フッタのコンポーネントにアクセスする場合は、それらのコンポーネントにTagを付けておき、[cell viewWithTag:]メソッドを使ってアクセスすることができる。
ヘッダ/フッタのビュー自体にタグを仕込んで、ヘッダ上のコンポーネントから参照したい場合はcell.ContentViewに対してTagを設定する。
(ヘッダ/フッタ上のボタンを押された時に、superViewのTagを見てセクションを把握するとかいう小技が使える)。
参照サイト:
stackoverflow
関連記事
-
ENMLからHTMLへの変換
最近EvernoteAPIをいじっているので、コレに関するノウハウをとりあえず断片的に引っかかったと
-
UISegmentedControlに見栄え良く背景色を設定する
UISegmentedControlをiOS7で使おうとすると、基本の背景色が「透明」になりますが、
-
iOS8のシミュレーターでLocalizationのテストをする
iOS8.1のシミュレーターでは、従前できていたシミュレーター内での「設定」(Setting)からの
-
”No Scheme”になってしまった場合の対応
知人がXcodeで突然「No Scheme」表示になってRunするターゲットとデバイスが選択できない
-
バージョンアップ版があることを通知する
拍子抜けするほど簡単だったので、「アプリのバージョンアップの通知をどうするか」という話についてTip
-
Xcode5.1のInterfaceBuilderにおける地味な変更点
iOS7.1に合わせてXcode5.1がリリースされました Xcode Release N
-
iPadのUIModalPresentationFormSheetでキーボードが閉じない
iPadでUIModalPresentationFormSheet(全画面ではなく、中央にフロートし
-
UITableViewのセルセパレータが画像の下部分だけ切れる場合の対応
iOS7のUItableViewCellだと、UITableView.imageViewに画
-
CALayerの管理
CALayerはNSKeyValueCodingを実装している(Core Animation Ext
-
viewDidLoadとviewDidLayoutSubviewsのタイミング
真実の記事にある「コードでiPhone6を識別する」話とほんのちょっとだけ繋がっている話で、view
- PREV
- plistファイルに色を入れる
- NEXT
- iOS6時代のアプリのiOS7への対応