在我的项目中,我有三个 tabBar 项目主页、通知和配置文件。侧面菜单 Controller 有主页、预订、个人资料和注销。侧边栏菜单 Controller 是通过使用 SWRevealViewController cocopods 完成的。
当我将侧边栏菜单导航到主页时,标签栏索引被正确选择并正确导航。从预订导航时,它可以正确导航,但导航家庭应用程序再次崩溃。并且控制台输出显示无法将类型“UINavigationController”(0x10ef79420)的值转换为“UITabBarController”(0x10ef79970)。
因为预订 Controller 是自定义 View Controller ,其余是标签栏 Controller 。并且当导航到预订屏幕 View Controller 标签栏时应该隐藏并且用户再次点击菜单按钮并导航到主页或任何其他 Controller 。
并且由于预订 Controller 没有标签栏索引而崩溃。那么如何在不崩溃的情况下导航到具有选定索引项的自定义 Controller 和标签栏 Controller 。
这是我的截图:
我的 Storyboard截图:
这是我试过的代码:
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")
}
}
}
其他其余 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())
}
}
}
您的输出:
关于ios - UINavigation Controller 到 UITabbarcontroller 问题与 iOS Swift 中的 SWRevealViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51639557/