ios - UINavigation Controller 到 UITabbarcontroller 问题与 iOS Swift 中的 SWRevealViewController

标签 ios swift uitableview uitabbarcontroller swrevealviewcontroller

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

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

因为预订 Controller 是自定义 View Controller ,其余是标签栏 Controller 。并且当导航到预订屏幕 View Controller 标签栏时应该隐藏并且用户再次点击菜单按钮并导航到主页或任何其他 Controller 。

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

这是我的截图:

bookings screen controller menu controller where swrevealviewcontroller used

我的 Storyboard截图:

enter image description here

这是我试过的代码:

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 会是这样你不直接分配 UITabBarControllerrevealViewController().frontViewController 需要像这样使用。

enter image description here

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())
    }

  }
}

您的输出:

enter image description here enter image description here

关于ios - UINavigation Controller 到 UITabbarcontroller 问题与 iOS Swift 中的 SWRevealViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51639557/

相关文章:

ios - react native 063 ld : library not found for -lDoubleConversion

android - Phonegap 拦截 jQueryMobile Ajax 调用

ios - 与 android apk 文件相比,我的 App iPA 文件大小非常大

swift - 为什么不在 Swift 中使用可选值?

ios - 以编程方式将两个文本字段添加到 tableViewCell

ios - 如果在JSON对象中加载了空图片网址,则应用崩溃

ios - 一旦下一个以模态方式出现,就关闭或删除以前以模态方式呈现的 View Controller

ios - 如果删除和添加相同的 View ,UIStackView 不会填充

ios - ViewWillTransitonToSize 旋转动画

ios - fatal error : unexpectedly found nil while unwrapping an Optional value swift When Selecting tableView Cells