開発メモ

開発関係のメモをいろいろと。たぶん。

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形式の動作はこんな感じ。

f:id:see_ku:20140927201822p:plain

今回作ったのはこんな感じ。

f:id:see_ku:20140927201842p:plain

背景の色が変わってるだけなのでわかりにくいけど、実際には、ViewControllerそのものが切り替わってる。

ちなみに、iPhone 6 Plusで動かすとこんな感じ。

f:id:see_ku:20140927201901p:plain

実際の処理

通常、画面の遷移は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