お世話になっております。サイドメニュー実装時のサンプルコードにて表題にございます関数の必要性の理解にいたらないためにご相談させていただきます。
疑問点とコード
サイドメニュー表示の際にNavigationControllerを使用してStoryBoard上でButtonを配置したのちにIBActionでコードに紐付け、ボタンが押された際にサイドメニューが表示されていれば閉じる。されていなければサイドメニューを表示させるといった処理を行っているのですが、非表示の際に行われる処理に意味がわかりません。
◆下記コード
//一部省略 let sidemenuViewController = SideMenuViewController() let contentViewController = UINavigationController(rootViewController: UIViewController()) //IBActionでボタンが押下された際の処理 @IBAction func MenuButtonPusshed(_ sender: Any) { if sidemenuViewController.contentRatio == 0{ showsidemenu(animated: true) } else { hideSidemenu(animated: true) } } //分岐が表示に入った際 private func showsidemenu(contentAvailavility:Bool = true,animated: Bool) { addChild(sidemenuViewController) sidemenuViewController.view.autoresizingMask = .flexibleHeight sidemenuViewController.view.frame = contentViewController.view.bounds view.insertSubview(sidemenuViewController.view, aboveSubview: contentViewController.view) sidemenuViewController.didMove(toParent: self) if contentAvailavility{ sidemenuViewController.showContentView(animated: animated) } } //分岐が非表示に入った際※解らない箇所 private func hideSidemenu(animated: Bool) { // if !isShownSidemenu { return } sidemenuViewController.hideContentsView(animeted: animated,completion: { (_) in self.sidemenuViewController.willMove(toParent: nil) self.sidemenuViewController.removeFromParent() self.sidemenuViewController.view.removeFromSuperview() }) } //一部省略
上記コードにて分岐が非表示に入った際、sidemenuViewControllerで持っているhideContentsView関数にクロージャー引数として渡している三つのwillMove、removeFromParent、removeFromSuperviewは何をしているのでしょうか? showsidemenu関数内にてaddChild(sidemenuViewController)として自身のViewの子としてsidemenuViewControllerを追加しているので非表示の際にはsidemenuViewControllerの親(ここではself)をRemoveしているのか・・・?とも思ったのですが、その場合はなぜself.sidemenuViewController.view.removeFromSuperview()のみではいけないのでしょうか?
SuperViewとの関係を絶てば問題ないような気がするんですが。。。willmoveについてもドキュメントを見ましたがコンテナビューから削除された際に呼ばれます。と書いてありますが呼ばれたあとこのコードでは何してるの!?という感じでした。。。
また、上記三つの処理をコメントアウトしてもサイドメニューの表示・非表示は特に問題なく動作しましたので目に見えたこちらの処理の必要性が解らない状態です
また、sidemenuViewControllerクラスの処理は省略しております。そちらのコードも記載の必要がある場合はお申し付けいただけますと幸いです。
英語が苦手でどのドキュメントを見ても解らず。。。日本語で回答いただけるこちらで質問させていただきました。
以上になります。よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー