【swift】uitableviewで読込中indicatorを表示する方法メモ
はじめに
今回やりたかったのは、APIから取得した値をテーブルビューにセット。
テーブルビューの1番下までスクロールしたら読込中のクルクルインジゲーターを表示。
というまぁありがちなやつ
で、やりかた調べたらここにありました。
http://d.hatena.ne.jp/glpgsinc/20121025/1351134405
読み込み中の場合
・1セクション目に通常のテーブルセル表示
・2セクション目に読み込み中のテーブルセル表示
読み込み中でない場合
・1セクション目に通常のテーブルセル表示
・2セクション目は非表示に
実装
で、swiftでコードレベルにしたものが以下になります
読込中テーブルセル
LoadingTableViewCell.swift
import UIKit class LoadingTableViewCell: UITableViewCell { var indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray) override init(style: UITableViewCellStyle, reuseIdentifier: String!) { super.init(style: style, reuseIdentifier: reuseIdentifier) setup() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setup() } func setup() { indicator.startAnimating() addSubview(indicator) } override func willMove(toSuperview newSuperview: UIView?) { var x = bounds.width/2 if newSuperview != nil { x = (newSuperview?.bounds.width)!/2 } let y = bounds.size.height/2 indicator.center = CGPoint(x: x, y: y) } func getHeight() -> CGFloat { return 48 } }
呼び出し側
ViewController.swift
mport UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // 0:未処理 1:読込中 2:読込終了 3:全データ読込完了 var status = 0 var tableView: UITableView! var loadingCell = LoadingTableViewCell() var contents: [Dictionary<String,AnyObject>] = [] override func viewDidLoad() { super.viewDidLoad() callApi() setView() } func setView() { let clearView = UIView(frame: CGRect.zero) clearView.backgroundColor = UIColor.clear tableView = UITableView(frame: CGRect(x: 5, y: 10, width: view.frame.width-(5*2), height: view.frame.height-(10*2))) tableView.register(MyTableViewCell.self, forCellReuseIdentifier: "MyTableViewCell") tableView.delegate = self tableView.dataSource = self view.addSubview(tableView) } func callApi() { status = 1 // MyApi.get()はAPIにアクセスして非同期でデータを取得するメソッド MyApi().get(callback: { (result) in if let contents = result?["contents"] as? [Dictionary<String,AnyObject>] { self.contents += contents self.tableView.reloadData() self.status = 2 } else { self.status = 3 } }) } func numberOfSections(in tableView: UITableView) -> Int { if status == 1 { return 2 } else { return 1 } } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.section == 0 { return calculationCell.getHeight() } else { return loadingCell.getHeight() } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.section == 0 { let cell = tableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath) as! MyTableViewCell return cell } else { return loadingCell } } func scrollViewDidScroll(_ scrollView: UIScrollView) { if status == 1 { return } else if tableView.contentOffset.y + tableView.bounds.size.height < tableView.contentSize.height { return } callApi() } }
ずらずら書いたけど以上です