iOS Swift中的UINavigation控制器到UITabbarcontroller问题

在我的项目中,我有三个tabBar项目主页,通知和配置文件。 侧边菜单控制器有家,预订,个人资料和注销。 侧栏菜单控制器是使用SWRevealViewController cocopods完成的。

当我导航侧栏菜单到主页标签栏索引正确选择并正确导航。 在从预订导航时,它可以正常导航,但再次导航主应用程序会崩溃。 并且控制台输出表示无法将’UINavigationController’(0x10ef79420)类型的值转换为’UITabBarController’(0x10ef79970)。

由于预订控制器是自定义视图控制器,剩下的是标签栏控制器。 当导航到预订屏幕视图控制器标签栏应该隐藏,用户再次点击菜单按钮并导航到家或任何其他控制器。

由于预订控制器崩溃并没有标签栏索引。 那么如何在不崩溃的情况下导航到具有所选索引项的自定义控制器和tabbar控制器。

这是我的截图:

预订屏幕控制器 swrevealviewcontroller使用的菜单控制器

我的故事板截图:

在此处输入图像描述

这是我尝试过的代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // tableView.deselectRow(at: indexPath, animated: true) let row = indexPath.row if row == 0{ let tabBarController = revealViewController().frontViewController as! UITabBarController let storyboard = UIStoryboard(name: "Home", bundle: nil) let obj = storyboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController let navController = UINavigationController.init(rootViewController: obj) tabBarController.selectedIndex = (indexPath as NSIndexPath).row tabBarController.tabBar.isHidden = false self.revealViewController().pushFrontViewController(tabBarController, animated: true) } else if row == 1{ let tabBarController = revealViewController().frontViewController as! UITabBarController let storyboard = UIStoryboard(name: "Bookings", bundle: nil) let obj = storyboard.instantiateViewController(withIdentifier: "BookingsViewController") as! BookingsViewController let navController = UINavigationController.init(rootViewController: obj) // tabBarController.selectedIndex = 1 // tabBarController.tabBar.isHidden = false self.revealViewController().pushFrontViewController(navController, animated: true) } else if row == 2 { let tabBarController = revealViewController().frontViewController as! UITabBarController let storyboard = UIStoryboard(name: "Profile", bundle: nil) let obj = storyboard.instantiateViewController(withIdentifier: "profileViewController") as! profileViewController let navController = UINavigationController.init(rootViewController: obj) tabBarController.selectedIndex = (indexPath as NSIndexPath).row tabBarController.tabBar.isHidden = false self.revealViewController().pushFrontViewController(tabBarController, animated: true) } else if row == 3 { print(indexPath) // Log out user from Firebase AuthService.signOut(onSuccess: { // Present the Sign In VC // PrefsManager.sharedinstance.logoutprefences() let storyboard = UIStoryboard(name: "Main", bundle: nil) let signInVC = storyboard.instantiateViewController(withIdentifier: "signInViewController") self.present(signInVC, animated: true) // self.navigationController?.pushViewController(signInVC, animated: true) }) { (errorMessage) in ProgressHUD.showError(errorMessage) } } } 

这是SWRevealViewController的工作代码,带有 UINavigationController UITabBarController (Swift 4)

你的Storyborad就像这样你不直接将UITabBarController分配给revealViewController().frontViewController需要像这样使用。

在此处输入图像描述

MenuViewController的代码像这样

 import UIKit class menuViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { @IBOutlet weak var tblTableView: UITableView! @IBOutlet weak var imgProfile: UIImageView! var ManuNameArray:Array = [String]() var iconArray:Array = [UIImage]() override func viewDidLoad() { super.viewDidLoad() ManuNameArray = ["Home","Booking","Profile","Logout"] iconArray = [UIImage(named:"home")!,UIImage(named:"message")!,UIImage(named:"map")!,UIImage(named:"setting")!] imgProfile.layer.borderWidth = 2 imgProfile.layer.borderColor = UIColor.green.cgColor imgProfile.layer.cornerRadius = 50 imgProfile.layer.masksToBounds = false imgProfile.clipsToBounds = true // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return ManuNameArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "MenuCell", for: indexPath) as! MenuCell cell.lblMenuname.text! = ManuNameArray[indexPath.row] cell.imgIcon.image = iconArray[indexPath.row] return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let revealviewcontroller:SWRevealViewController = self.revealViewController() let cell:MenuCell = tableView.cellForRow(at: indexPath) as! MenuCell print(cell.lblMenuname.text!) if cell.lblMenuname.text! == "Home" { print("Home Tapped") let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil) // Here TabbarController is StoryboardID of UITabBarController if let tabBarController = mainstoryboard.instantiateViewController(withIdentifier: "TabbarController") as? UITabBarController{ tabBarController.selectedIndex = 0 revealviewcontroller.pushFrontViewController(tabBarController, animated: true) } } if cell.lblMenuname.text! == "Booking" { print("message Tapped") let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let newViewcontroller = mainstoryboard.instantiateViewController(withIdentifier: "BookingViewController") as! BookingViewController let newFrontController = UINavigationController.init(rootViewController: newViewcontroller) revealviewcontroller.pushFrontViewController(newFrontController, animated: true) } if cell.lblMenuname.text! == "Profile" { let mainstoryboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil) if let tabBarController = mainstoryboard.instantiateViewController(withIdentifier: "TabbarController") as? UITabBarController{ tabBarController.selectedIndex = 2 revealviewcontroller.pushFrontViewController(tabBarController, animated: true) } } if cell.lblMenuname.text! == "Logout" { print("Logout Tapped") } } } 

其他剩余ViewControllers的代码与所有家庭,通知,个人资料和预订的以下内容相同

 import UIKit class ProfileViewController: UIViewController { @IBOutlet weak var btnMenuButton: UIBarButtonItem! override func viewDidLoad() { super.viewDidLoad() if revealViewController() != nil { btnMenuButton.target = revealViewController() btnMenuButton.action = #selector(SWRevealViewController.revealToggle(_:)) view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer()) } } } 

你的输出:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述