iOS Swift 中 SWRevealViewController 的 UINavigation 控制器到 UITabbarcontroller 的问题
UINavigation controller to UITabbarcontroller issue with SWRevealViewController in iOS Swift
在我的项目中,我有三个 tabBar 项目主页、通知和配置文件。侧面菜单控制器有主页、预订、个人资料和注销。侧边栏菜单控制器是通过使用 SWRevealViewController cocopods 完成的。
当我将侧边栏菜单导航到主页标签栏索引时,已正确选择并正确导航。从预订导航时,它可以正确导航,但导航家庭应用程序再次崩溃。控制台输出显示 Could not cast value of type 'UINavigationController' (0x10ef79420) to 'UITabBarController' (0x10ef79970).
因为预订控制器是自定义视图控制器,其余是标签栏控制器。并且当导航到预订屏幕视图控制器标签栏时应该隐藏并且用户再次点击菜单按钮并导航到主页或任何其他控制器。
并且由于预订控制器没有标签栏索引而崩溃。那么如何在不崩溃的情况下导航到具有选定索引项的自定义控制器和标签栏控制器。
这是我的截图:
我的故事板截图:
这是我试过的代码:
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
(Swift4)
你的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")
}
}
}
其他其余 ViewController 的代码与以下所有主页、通知、配置文件和预订的代码相同
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())
}
}
}
你的输出:
在我的项目中,我有三个 tabBar 项目主页、通知和配置文件。侧面菜单控制器有主页、预订、个人资料和注销。侧边栏菜单控制器是通过使用 SWRevealViewController cocopods 完成的。
当我将侧边栏菜单导航到主页标签栏索引时,已正确选择并正确导航。从预订导航时,它可以正确导航,但导航家庭应用程序再次崩溃。控制台输出显示 Could not cast value of type 'UINavigationController' (0x10ef79420) to 'UITabBarController' (0x10ef79970).
因为预订控制器是自定义视图控制器,其余是标签栏控制器。并且当导航到预订屏幕视图控制器标签栏时应该隐藏并且用户再次点击菜单按钮并导航到主页或任何其他控制器。
并且由于预订控制器没有标签栏索引而崩溃。那么如何在不崩溃的情况下导航到具有选定索引项的自定义控制器和标签栏控制器。
这是我的截图:
我的故事板截图:
这是我试过的代码:
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
(Swift4)
你的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")
}
}
}
其他其余 ViewController 的代码与以下所有主页、通知、配置文件和预订的代码相同
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())
}
}
}
你的输出: