Master側の選択に応じてDetail側のViewControllerを切り替える
開発環境
環境 | 情報 |
---|---|
Xcode | 6.0.1 (6A317) |
Swift | 1.0 |
iOS | 8.0 |
Date | 2014/09/27 |
概要
Master - Detail形式のアプリで、Master側の選択に応じてDetail側のViewControllerを切り替える実験をしたメモ。iOS8でUISplitViewControllerが改良されてて、意外と簡単に出来た・・・ その代わり(?)、iPhone 6 Plusへの対応は大変そうだけど。
ちなみに、通常のMaster - Detail形式の動作はこんな感じ。
今回作ったのはこんな感じ。
背景の色が変わってるだけなのでわかりにくいけど、実際には、ViewControllerそのものが切り替わってる。
ちなみに、iPhone 6 Plusで動かすとこんな感じ。
実際の処理
通常、画面の遷移はStoryboardで設定するのが楽だけど、この場合は使えないので素直に諦めた。遷移先のViewControllerには、それぞれ、Storyboard IDを設定しておいて、これを元にしてViewControllerを実体化、遷移先に使用してる。
MasterViewController.swift
実際に遷移を行ってる関数はこんな感じ。
// 選択されたCellのreuseIdentifierにあわせて、画面を遷移 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let cell = tableView.cellForRowAtIndexPath(indexPath) let id = cell?.reuseIdentifier let vc = storyboard?.instantiateViewControllerWithIdentifier(id!) as UIViewController // NavigationItemを移植 var item = vc.navigationItem if let nc = vc as? UINavigationController { item = nc.topViewController.navigationItem } item.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() item.leftItemsSupplementBackButton = true // ViewControllerを変更 splitViewController?.showDetailViewController(vc, sender: self) tableView.deselectRowAtIndexPath(indexPath, animated: true) }
Cellが選択された時の関数をoverrideしてそのまま使用。予め、CellのreuseIdentifierとViewControllerのStoryboard IDは一致させてある。NavigationItemを忘れずに移植。あとは、showDetailViewController()で新しいViewControllerを表示させるだけ。
AppDelegate.swift
今回は、画面を閉じる時は常にMaster側を優先するように設定。
func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController!, ontoPrimaryViewController primaryViewController:UIViewController!) -> Bool { // 常に、Master側の画面を優先 return true }
本来なら、プログラムに応じてどうするかを設定するべき。
ソースコード
ソースコードはこちら。
See_Ku / DetailSwitchTips — Bitbucket
https://bitbucket.org/See_Ku/detailswitchtips