在我的项目中,我有三个tabBar项目主页,通知和配置文件。侧边菜单控制器有家,预订,个人资料和注销。侧栏菜单控制器是使用SWRevealViewController cocopods完成的。
当我导航侧栏菜单到主页标签栏索引正确选择并正确导航。在从预订导航时,它可以正常导航,但再次导航主应用程序会崩溃。并且控制台输出表示无法将'UINavigationController'(0x10ef79420)类型的值转换为'UITabBarController'(0x10ef79970)。
由于预订控制器是自定义视图控制器,剩下的是标签栏控制器。当导航到预订屏幕视图控制器标签栏应该隐藏,用户再次点击菜单按钮并导航到家或任何其他控制器。
由于预订控制器崩溃并没有标签栏索引。那么如何在不崩溃的情况下导航到具有所选索引项的自定义控制器和tabbar控制器。
这是我的截图:
我的故事板截图:
这是我试过的代码:
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())
}
}
}
你的输出: