- ベストアンサー
UITableViewCellのカスタマイズ方法
- UITableViewCellに様々なコントロール要素をのせて表示する方法
- サイトを参考にUITableViewCellにセルごとにボタンやラベルなどのレイアウトを設定して表示することができるが、複数のレイアウトを合わせて表示する方法がわからない
- トップ画像のように様々なレイアウトのセルを表示するためには、switch文の中に複数のレイアウトを記述する必要があるが、エラーが発生する
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> UISwitch *sw の行から cell.textLabel.text = @"Flash Light";の行までをswitch(indexPath.row)文の中に入れると、UISwitch *sw = ... の行でExpected expressionというエラーが出てしまうので他のレイアウトを表示することができません。 Expected expressionというエラーがどの段階(ビルド時?or実行時?)で出るのかと、 実際にエラーがでた時のコーディングが示されてないので、このエラーの原因は わかりませんが、質問にある http://www.yoheim.net/blog.php?q=20130106 に書かれてある方法はあまりやらない方がよいと思います。 なぜなら、 http://obc-fight.blogspot.jp/2013/07/uitableview-uitableview1.html や https://ios-practice.readthedocs.org/en/latest/docs/tableview/ にある通り、contentViewの中にaddSubviewすると、次にそのセルが 再利用された時に、前回addSubviewした部品が残ったまま、その上にまた addSubviewすることになります。またaccessoryViewに部品を表示した セルがcontentViewを使うセルで再利用された時、accessoryViewを削除 しないと余計な部品が残ることになってしまいます。 それを回避するには http://blog.summerwind.jp/archives/1352 にあるように、一旦accessoryViewやcontentViewの中に設定した部品を 削除してから再利用すればよいわけですが、これじゃほとんど再利用の 意味がありません。 UITableViewをDynamic Prototypesで使うなら、カスタムセルを作ることを お勧めします。 ただ、あなたのやりたいことはDynamic Prototypesでなく、Static Cellsで 実装した方がよいように思います。しかしStatic CellsはUITableViewController上で しか使えません。 その場合は、メインのViewControllerの中にコンテナViewControllerを埋め込み、 その埋め込みViewControllerをUITableViewControllerのStatic Cellsに すればよいです。 参考になるURLを探そうとしましたが見つけられませんでしたので、ここで手順を示します。 基本的に以下の手順でよいはずです。 1.Single View Applicationのプロジェクトを作る。 2.StoryBoardのメインビューを表示する。 3.右下の「Object View」から「Container View」を選択し、StoryBoardのメインビューにドラッグする 4.コンテナビューの埋め込み位置、サイズを適当に調整する。 5.コンテナビューに自動的にリンクされているViewControllerを一旦削除する。 6.右下の「Object View」から「Table View Controller」を選択し、Storyboardにドラッグする。 7.コンテナビューからTableViewControllerにctrlを押しながら線をドラッグし、embedを選択する。 8.TableViewのAttributes inspectorで、Contentを「Static Cells」にする。 9.StoryBoardのセル内にラベルやボタン等の部品を配置し、好きにデザインする。 ~ここまでで一旦実行すれば、とりあえず全体ビューの一部にテーブルビューが表示され、 配置したボタンやラベルも表示されると思います。 (ここまでコーディングなしで定義できます) あと、ボタンの動作やラベルの表示を処理したければ、 10.UITableViewControllerのサブクラスとなるクラスファイルを新規生成。 11.ストーリーボードのTableViewControllerで、Identity inspectorのCustom classに そのテーブルビューコントローラーを設定する 12.ストーリーボードのセル内に配置している各部品をそのテーブルビューコントローラーに接続 13.接続した部品の処理をコーディング こんな感じでいけると思います。
その他の回答 (1)
- Lchan0211b
- ベストアンサー率61% (573/930)
> この方法であれば、dequeueReusableCellWithIdentifier:を使わずに済むから、addSubViewした物が重なる問題が起こらないという事でしょうか? いえ、dequeueReusableCellWithIdentifier:を使わずに済むからではなく、 cellForRowAtIndexPath内でaddSubViewしなくて済むから、 何度もaddSubViewされないと言うことです。 > TableViewControllerに必須であると思っていた > - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath > や > - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section > のメソッドを記述したままだとエラーが出ましたが、コメントアウトすると実行できました。 はい。Static Cellsを使う場合はこれらは削除してください。 実は、Static Cellsのように上下スクロールする画面の中に自由な部品を配置したいなら、 UIScrollViewの中に縦長のViewを作ってcontentSizeを設定しても実現できます。 (罫線はlightGrayColorで横線のViewを作ればいいだけです。) これなら、わさわざコンテナビューコントローラーにテーブルビューコントローラーを 配置するような大げさなことをしなくても、1つのビューコントローラー内で実現できます ので、メモリ使用効率はよいです。 ただ、UITableViewのStatic Cellsを使うと、Xcodeのテーブル編集機能を使って 画面部品を自由に配置できますので、とても便利です。 今回UITableViewのStatic Cellsを使った理由は、そういうXcodeの便利機能を使うためだと 考えておいてください。本来はUIScrollViewで実現できることです。
お礼
回答ありがとうございます! いろいろな方法があるのですねー ScrollViewの使い方についても勉強しておこうと思います。 UITableViewのメソッドを使うか使わないか、そういうところでメモリ効率も考えながらどの方法を選ぶか決めて行くのですね。 とても勉強になります^^
お礼
詳しい回答ありがとうございます! addSubViewしたものが重なって表示されて、エラーの原因となったり処理が重くなってしまうんですね。 セルの数は固定で考えているのでご指摘の通りStaticCellでやった方が良さそうです。 教えていただいた手順の通りに組み込んだところ、それぞれのセルを違うレイアウトで表示することができました! この方法であれば、dequeueReusableCellWithIdentifier:を使わずに済むから、addSubViewした物が重なる問題が起こらないという事でしょうか? TableViewControllerに必須であると思っていた - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath や - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section のメソッドを記述したままだとエラーが出ましたが、コメントアウトすると実行できました。 staticCellであれば、全てstoryboard上でまかなえてしまうと分かりました^^ 教えていただいた方法を用いれば、セル毎にレイアウトを変えて更にそのセクションのセルの数も変動させたい、という事でもない限り、テーブル表示の目的に関してはだいたい対応できそうですね!