#author("2016-11-30T19:56:57+09:00","default:wikiwriter","wikiwriter")
#author("2016-11-30T20:28:30+09:00","default:wikiwriter","wikiwriter")
[[UIKit/テーブル]]

&tag(UIKit/テーブル/Tips);
*目次 [#g2739ad7]
#contents
*関連ページ [#q131401b]
*参考情報 [#g5188ae1]

*ヘッダービュー、フッタービューの利用 [#la408ad2]
-プロトタイプセルを追加しておき、その上下にViewを追加すればよい。プロトタイプセルが存在しないとうまくいかない。
-参考: [[How to size a table header view using Auto Layout in Interface Builder | Roadfire Software:http://roadfiresoftware.com/2015/05/how-to-size-a-table-header-view-using-auto-layout-in-interface-builder/]]…高さをフィットさせる方法。

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

*一覧・編集画面 [#o48dd029]

**編集画面の変更内容を一覧画面に反映する [#j0cad1f2]
***方法1: viewWillAppearで表示更新 [#b0aa03a8]
-「iOS開発におけるパターンによるオートマティズム」で紹介されていた方法(p136)。viewWillAppearでVisibleCellsを更新する方法。
#pre{{
    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: 通知を利用する [#q367c080]
-CoreDataを使用している場合、通知を利用することができる。Swift+CoreDataによるiOSプログラミングで解説されていた方法(p213)。
-viewDidLoadで通知を登録し、deinitで解除。通知をうけとったタイミングでreloadRowsAtIndexPathsを呼び出す。

**方法3 NSFetchedResultsControllerの通知を利用する。 [#x1bfe8b8]
-NSFetchedResultsControllerを使用している場合、自動でdelegateメソッドが呼ばれるのでそrを利用する。



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

**UITableView+UIViewControllerとUITableViewControllerの違い [#m2c057b6]
-UITableViewControllerではviewWillAppearで自動的にreloadDataが呼び出されることのほか、UITextFieldを含むセルを編集した際そのセルまで自動的にスクロールする処理が存在するなど、かなりな親切設計となっている。
--[[UITableViewController のreloadDataをコールするタイミング - Over&Out その後:http://d.hatena.ne.jp/shu223/20110403/1304235112]]
--[[UITableViewControllerのviewWillAppear:メソッドで気をつけること - More the iPhone Development Playground:http://kimada.hatenablog.com/entry/20090917/1253187128]]
--[[UITableViewControllerを使わないでテーブルビューを使うとき実装すべきメソッド - 24/7 twenty-four seven:http://blog.kishikawakatsumi.com/entry/20090121/1232548786]]
--[[ios - Disabling automatic scrolling of UITableView when editing UITextField inside UITableViewCell - Stack Overflow:http://stackoverflow.com/questions/9637089/disabling-automatic-scrolling-of-uitableview-when-editing-uitextfield-inside-uit]]
--[[xcode - Get UITableView to scroll to the selected UITextField and Avoid Being Hidden by Keyboard - Stack Overflow:http://stackoverflow.com/questions/5265559/get-uitableview-to-scroll-to-the-selected-uitextfield-and-avoid-being-hidden-by]]
--[[【Swift】UITableViewControllerとUITableViewの違い。 | はじはじアプリ体験記:http://hajihaji-lemon.com/smartphone/swift/uitableviewcontroller-difference/]]
-テーブルを全面に表示する画面の場合、UITableViewControllerを素直に使った方が良いかもしれない。

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

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

**UITableViewControllerの余分のセパレーターを消す。 [#v410261b]
-[[ios - Eliminate extra separators below UITableView - Stack Overflow:http://stackoverflow.com/questions/1369831/eliminate-extra-separators-below-uitableview]]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS