前提・実現したいこと
ハンバーガメニューに遷移後もNavigationControllerを引き継いだままにしたい
【!!質問を読まれる前に、まずこちらに目を通して頂けると幸いです!!】
結論から申し上げますと、こちらズレている質問をしておりますのでご回答いただく際には修正依頼の欄の連絡のやりとりをご覧いただけるとお時間を取らずに済むかと思われます。
ご指摘により、質問自体がズレているものであることに気付きました。私のほうで一度UIの設計から検討し直したいと思います。自身で解決(?)できた際に、実行した旨を追記していこうと思います。
なお、UIの設計等でご指摘やアドバイスありましたら大変助かりますので回答いただいても全く問題ございません。
失礼致しました。
2020/07/30
質問の最下部の補足を更新しました。
はじめまして。
iOS開発を始めて2ヶ月になる者です。
現在、転職活動のためのポートフォリを作成しております。
BaseViewControllerからSetUpViewController(ハンバーガメニュー)へ遷移させる際にNavigationControllerを引き継ぐことができず、困っております。
※ページの始まりにNavigationControllerを置いています。
BaseViewControllerの左横から被さる形でSetUpViewControllerをハンバーガーメニューとして表示してます。SetUpViewControllerにはkeychainAccessという外部ライブラリを用いて、一度ユーザー登録していただいた方のプロフィール画像とユーザー名を取得できるようにしております。アイコンボタンをタップすることで、ユーザー登録していただいたユーザーの方は、プロフィール画面(accountViewController)に遷移できる仕様にしております。
SetUpViewControllerにNavigationControllerを継承させないと、プロフィール画面(accountViewController)に遷移できない仕様になっております。
※なお、keychainAccessは自分で設定しておいたkeyに値を保持しておけるライブラリです。(間違ってたらすみません。)
説明わかりづらくて大変申し訳ありませんが、ご回答いただけると幸いです。
質問の後半に画面の遷移図を画像で載せておきました。
version
・Xcode 11.5
・Swift 5.2.4
以下、ソースになります。
ソースコード
swift
1BaseViewController.swift 2 3import UIKit 4import SegementSlide 5 6class BaseViewController:SegementSlideDefaultViewController { 7 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 } 13 14 override func viewWillAppear(_ animated: Bool) { 15 super.viewWillAppear(animated) 16 navigationController?.isNavigationBarHidden = false 17 } 18 19 //SetUpViewControllerを表示させるアクション 20 @IBAction func set(_ sender: Any) { 21 22 let setUpVC = self.storyboard?.instantiateViewController(withIdentifier: "setUp") as! SetUpViewController 23 self.navigationController?.present(setUpVC, animated: true) 24 25 } 26}
swift
1SetUpViewController.swift 2 3import UIKit 4import Firebase 5import KeychainAccess 6import SDWebImage 7 8class SetUpViewController: UIViewController, UIGestureRecognizerDelegate { 9 10 11 @IBOutlet weak var channelTapRecognizer: UIButton! 12 @IBOutlet var IconTapRecognizer: UITapGestureRecognizer! 13 @IBOutlet weak var profileIcon: UIImageView! 14 @IBOutlet weak var userNameLabel: UILabel! 15 @IBOutlet weak var menuView: UIView! 16 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 21 22 let IconTapRecognizer:UITapGestureRecognizer = UITapGestureRecognizer( 23 target: self, 24 action: #selector(SetUpViewController.tapped(_:))) 25 26 IconTapRecognizer.delegate = self 27 self.view.addGestureRecognizer(IconTapRecognizer) 28 29 } 30 31 override func viewWillAppear(_ animated: Bool) { 32 super.viewWillAppear(animated) 33 34 navigationController?.isNavigationBarHidden = false 35 36 //ハンバーガーメニューのアニメーション設定 37 let menuPosition = self.menuView.layer.position 38 self.menuView.layer.position.x = -self.menuView.frame.width 39 UIView.animate( 40 withDuration: 0.1, 41 delay: 0.1, 42 options: .curveEaseOut, 43 animations: { 44 self.menuView.layer.position.x = menuPosition.x 45 }, 46 completion: { bool in 47 }) 48 } 49 50 //ハンバーガメニューで表示されたページの外をタップすると、ハンバーガメニューが閉じるアクション 51 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 52 super.touchesEnded(touches, with: event) 53 for touch in touches { 54 if touch.view?.tag == 1 { 55 UIView.animate( 56 withDuration: 0.2, 57 delay: 0, 58 options: .curveEaseIn, 59 animations: { 60 self.menuView.layer.position.x = -self.menuView.frame.width 61 }, 62 completion: { bool in 63 self.dismiss(animated: true, completion: nil) 64 } 65 ) 66 } 67 } 68 } 69 70 //アイコンボタンタップアクション 71 //一度ユーザー登録していればaccountViewControllerページに遷移します 72 //ユーザー登録されていなければ、LoginViewControllerページに遷移します 73 @objc func tapped(_ sender: UITapGestureRecognizer){ 74 if sender.state == .ended { 75 76 if Auth.auth().currentUser?.uid != nil { 77 let accountVC = self.storyboard?.instantiateViewController(withIdentifier: "account") as! accountViewController 78 let keychain = Keychain(service: "XXXXXXXXXXX") 79 let fbUserName = keychain["XXXX"] 80 let fbUserPicture = keychain["XXXX"] 81 let twitterUserName = keychain["XXXX"] 82 let twitterUserPicture = keychain["XXXX"] 83 let emailUserName = keychain["XXXX"] 84 let emailUserPicture = keychain["XXXX"] 85 if fbUserName != nil || fbUserPicture != nil { 86 accountVC.userName = fbUserName! 87 accountVC.profileImage = fbUserPicture! 88 self.navigationController?.pushViewController(accountVC, animated: true) 89 }else if twitterUserName != nil || twitterUserPicture != nil { 90 accountVC.userName = twitterUserName! 91 accountVC.profileImage = twitterUserPicture! 92 self.navigationController?.pushViewController(accountVC, animated: true) 93 }else if emailUserName != nil || emailUserPicture != nil{ 94 accountVC.userName = emailUserName! 95 accountVC.profileImage = emailUserPicture! 96 self.navigationController?.pushViewController(accountVC, animated: true) 97 } else { 98 let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "login") as! LoginViewController 99 self.navigationController?.pushViewController(loginVC, animated: true) 100 } 101 } 102 103 } 104 else if sender.state == .began { 105 106 } 107 } 108} 109 110
試したこと
BaseViewControllerにて、以下のコードを書くとNavigationControllerを継承できることはわかりましたが、今度はハンバーガメニューが左横から覆いかぶさるように出現せず、SetUpViewControllerが独立したページとして表示されます。
swift
1let setUpVC = self.storyboard?.instantiateViewController(withIdentifier: "setUp") as! SetUpViewController 2self.navigationController?.pushViewController(setUpVC, animated: true)
補足情報(FW/ツールのバージョンなど)
その他もろもろ調べたのですが、解決できませんでした。
説明わかりづらくて大変申し訳ありませんが、ご回答いただけると幸いです。
長文失礼致しました。
【補足】
下記のURLを参考に作成しました。
http://swift.hiros-dot.net/?p=377
また、修正依頼にすでに記載済みではあるのですが、ご指摘いただいた通りハンバーガーメニューを出すことと Navigation Controller の利用は本質的に無関係みたいですのでもう少し自分で調べて解決していこうと思います。
お手数おかけします。
回答2件
あなたの回答
tips
プレビュー