UIKit/テーブル

Tag: UIKit/テーブル/Tips

目次

関連ページ

参考情報

ヘッダービュー、フッタービューの利用

ステータスバー対応

  • 何も考えずUITableViewControllerを実装するとステータスバーの下にセルが潜り込んでしまう。
  • やはりお前らのiOS7対応は間違っている(解説編) - Qiitaのはなしは関係なさそう。
  • 以下のようにcontentInsetを設定するしかないかも?ストーリーボードから設定する方法は不明。
        override func viewDidLoad() {
            super.viewDidLoad()
            self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)
            self.tableView.backgroundColor = UIColor.grayColor()
        }
    
  • ナビゲーションコントローラーを併用するとよろしくやってくれるので普通はそっちを使えばいいのかもしれない。

一覧・編集画面

編集画面の変更内容を一覧画面に反映する

方法1: viewWillAppearで表示更新

  • 「iOS開発におけるパターンによるオートマティズム」で紹介されていた方法(p136)。viewWillAppearでVisibleCellsを更新する方法。
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            if let indexPath = tableView.indexPathForSelectedRow {
                tableView.deselectRow(at: indexPath, animated: animated)
            }
            for cell in tableView.visibleCells {
    
            }
        }
    

方法2: 通知を利用する

  • CoreDataを使用している場合、通知を利用することができる。Swift+CoreDataによるiOSプログラミングで解説されていた方法(p213)。
  • viewDidLoadで通知を登録し、deinitで解除。通知をうけとったタイミングでreloadRowsAtIndexPathsを呼び出す。

方法3 NSFetchedResultsControllerの通知を利用する。

  • NSFetchedResultsControllerを使用している場合、自動でdelegateメソッドが呼ばれるのでそrを利用する。

方法4 layoutSubviewsで更新

  • 編集画面からの戻りで選択セルのlayoutSubviewsが何故か呼び出される。セルにモデルオブジェクトを保持しておき、layoutSubviewsで再設定するような処理にすればそれでいける。
  • ただしこの挙動が仕様かどうかよくわからないので、頼るのはやめたほうが良さそう。

その他

UITableView+UIViewControllerとUITableViewControllerの違い

UITableView+UIViewControllerとUITableViewControllerどちらを使えば良いか

  • iOS Table Viewプログラミングガイド (TP40007451 0.0.0)には以下のような記述がある。
    Table Viewを作成したり管理したりするには、UITableViewControllerのサブクラスのインスタ
    ンスを使用します
    
  • 対してTableViewを使うのは以下の場合。
    管理対象のビューが合成ビューで、その中の複数のサブビューの1つがTable Viewの場合は、そのTable
    View(およびその他のビュー)を管理するために、UIViewControllerのカスタムサブクラスを使用
    する必要があります。このコントローラクラスは、Table Viewをナビゲーションバーとタブバー(ど
    ちらかが存在する場合)の間の画面一杯に表示するため、UITableViewControllerを使用してはい
    けません。
    
  • 画面一杯にテーブルを表示したい場合、UITableViewControllerを使うほうがよさげ。

UITableViewControllerのviewWillAppearのreloadDataの扱い

  • UITableViewControllerのviewWillAppearではreloadDataが自動的に呼び出される処理となっているらしい。ただしこの処理が走るのはデータが存在しないときだけ(初回表示時だけ)。編集画面からの戻りで再表示したい場合は自分でreloadDataを呼び出さないと行けない。従って以下の実装が良いのだろう。
    - (void)viewWillAppear:(BOOL)animated {
        [self.tableView reloadData]; //先にリロードする。
        [super viewWillAppear:animated]; //すでに読み込み済みなのでデフォルト実装のリロードは動かない。
    }
    

UITableViewControllerの余分のセパレーターを消す。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-30 (水) 20:28:30