KYDrawerControllerとUINavigationControllerの画面遷移


背景

今回アプリ作成にあたって下記Home画面にだけサイドメニューを置くという、あまり見ない形の実装をすることになった。
[Login]-[Home]
     ├[View1-1]-[View1-2]...
     ├[View2-1]-[View2-2]...
     └[View3-1]-[View3-2]...
※ 僕のイメージだとサイドメニューはtabcontrollerの代わりとして使うイメージ
※ そもそもiOSにこの手のメニューが無い

使うことにしたライブラリ

storyboard上でサクッとメニューを作れそうなので、これを使うことにした。
https://github.com/ykyouhei/KYDrawerController/
久しぶりにiOS周りやってるのと、サンプルがアレすぎて役に立たなかったのでメモ代わりにやったことを記載することにした。

実装した内容

概ねStoryboard上での設定はライブラリのreadmeおよびサンプルを見れば多少なんとかなるはずなので、省略。
メニュー画面で実装したコード。

SideMenuViewController.swift
    @IBAction func view1ActionButton(_ sender: UIButton) {
        if let drawerController = navigationController?.parent as? KYDrawerController {
            let storyBoard = UIStoryboard(name: "Main", bundle: nil)
            let view1 = storyBoard.instantiateViewController(withIdentifier: "view1")
            (drawerController.mainViewController as? UINavigationController)?.pushViewController(view1, animated: true)

            drawerController.setDrawerState(.closed, animated: true)
        }
    }

    @IBAction func view2ActionButton(_ sender: UIButton) {
        if let drawerController = navigationController?.parent as? KYDrawerController {
            let storyBoard = UIStoryboard(name: "Main", bundle: nil)
            let view2 = storyBoard.instantiateViewController(withIdentifier: "view2")
            (drawerController.mainViewController as? UINavigationController)?.pushViewController(view2, animated: true)

            drawerController.setDrawerState(.closed, animated: true)
        }
    }

    @IBAction func view3ActionButton(_ sender: UIButton) {
        if let drawerController = navigationController?.parent as? KYDrawerController {
            let storyBoard = UIStoryboard(name: "Main", bundle: nil)
            let view3 = storyBoard.instantiateViewController(withIdentifier: "view3")
            (drawerController.mainViewController as? UINavigationController)?.pushViewController(view3, animated: true)

            drawerController.setDrawerState(.closed, animated: true)
        }
    }

    @IBAction func logoutActionButton(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }

    @IBAction func closeActionButton(_ sender: UIButton) {
        if let drawerController = navigationController?.parent as? KYDrawerController {
            drawerController.setDrawerState(.closed, animated: true)
        }
    }

mainViewController側でnavigationさせるのがうまくいかずに大分消耗した。
別のライブラリに関するサイトだけど、下記を見て「あー」となったので気づけた。
よかったよかった
https://www.project-respite.com/slidemenucontroller/

その他

  • なんかstoryboard取得もっと短くかけた気がしたけど忘れた
  • AutoLayout使ってるとメニューをdrawerController.setDrawerState(.opened, animated: true)で呼び出す際、微妙に「にゅっ」とする。(AutoLayout切ると問題なくなるので、作りでなんとかできそうな予感はするが、優先度下げて後日対応)
  • やはり標準で用意されてること以外やろうとすると何でも苦労するね