相変わらず演劇感想文リンクのアプリを開発しています。
まずは、完成イメージ。
前回までに作成した公演情報の下に劇評の一覧を表示します。UITableViewを使いたいのですが、色々なサンプルの殆どが、画面全体をUITableViewにするものしか見つけられませんでした。試行錯誤をしてなんとか形にできたので、共有です。
とはいえ、結局は以下の手順で実現することができました。
・UITableViewを画面の部品クラスとして実装
・その部品を親画面にaddSubviewで追加
・位置設定を行い、画面上に正しく表示する。
■別のファイルで、TableViewのクラスを設定
ネットで見つけたサンプルだと、ViewControllerにTableViewのDelegate等をもたせている例が多かったのですが、VCではなくViewそのものにもたせることにして、別ファイルでClassを作成しました。
劇評画面
import UIKit class 劇評集画面型:UITableView,UITableViewDataSource,UITableViewDelegate { var numberOfCells=0 var 劇評集:[劇評型]=[] var selected: Int? var 親画面:公演画面型? override init(frame:CGRect,style: UITableViewStyle){ super.init(frame: frame,style: style) self.dataSource=self self.delegate=self } required init(coder aDecoder:NSCoder){ fatalError("init(coder:)has not been implemented") } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 劇評集.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") as UITableViewCell cell.textLabel?.text="\(劇評集[indexPath.row].劇評者)(\(劇評集[indexPath.row].観劇日))," return cell } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { print("\(劇評集[indexPath.row].劇評者)") } override func layoutSubviews() { super.layoutSubviews() } }
■addSubViewで親画面に追加。
UITableViewもUIViewのサブクラスなので、普通にaddSubViewで親画面に追加できます。
//劇評者集画面 lazy var 劇評集画面:劇評集画面型=self.劇評集画面生成() override func 共通初期化(){ super.共通初期化() 〜中略〜 self.addSubview(劇評集画面) } private func 劇評集画面生成() -> 劇評集画面型{ let 画面 = 劇評集画面型(frame:CGRectZero) return 画面; }
■位置設定を行い、画面上に正しく表示する。
本来的には、Autolayout等を利用して制約をきちんとかけるべきなのですが、とりあえず簡単にすませてしまいました。
private func 劇評集画面配置(){ let 劇評集画面頂点=値ラベル集[値ラベル集.count-1].frame.origin.y+値ラベル集[値ラベル集.count-1].frame.size.height 劇評集画面.frame.size=CGSizeMake(self.frame.size.width-20,self.frame.size.height-劇評集画面頂点-20) 劇評集画面.frame.origin.y=劇評集画面頂点+10 劇評集画面.frame.origin.x=10 劇評集画面.backgroundColor=UIColor(white: 0.9,alpha:1.0) }
この画面のサイズ及び位置を決定する関数「劇評集画面配置」をlayoutSubViews()の中でコールすれば、縦/横のサイズ変更にも対応してくれました。
コメントを残す