【问题标题】:UINavigation controller to UITabbarcontroller issue with SWRevealViewController in iOS SwiftiOS Swift 中 SWRevealViewController 的 UINavigation 控制器到 UITabbarcontroller 问题
【发布时间】:2019-01-09 09:29:09
【问题描述】:

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

当我将侧边栏菜单导航到主页选项卡栏索引时,已正确选择并正确导航。从预订导航时,它可以正确导航,但再次导航主页应用程序会崩溃。控制台输出显示无法将“UINavigationController”(0x10ef79420)类型的值转换为“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)

        }



    }


}

【问题讨论】:

  • 您是否需要 TabBar 仅在 Home 部分?
  • @VRAwesome 是的,我需要主页和个人资料屏幕中的 tabBar,而不是预订屏幕
  • 可能的关注点是revealViewController().frontViewController as! UITabBarController。似乎revealViewController().frontViewController 可能是导航控制器,如上一个屏幕截图所示。为了帮助您调试,尝试打印revealViewController().frontViewController的类型,也许frontViewController不是您期望的控制器?

标签: ios swift uitableview uitabbarcontroller swrevealviewcontroller


【解决方案1】:

这是 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 的代码与所有 Home、Notification、Profile 和 Booking 的代码相同

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

  }
}

你的输出:

【讨论】:

  • 太棒了!你节省了我的时间.. 感谢您的回答
  • 嘿,我还有一个疑问,不是这个问题。 swift 中的另一个 Firebase 电子邮件更新
  • @PvDev 您想只更新电子邮件还是同时更新电子邮件和密码?
  • 只有电子邮件而不是密码这里是我试过的代码:drive.google.com/file/d/1ZQtzvdU_NngUeyNGmt1wgOpRIDDELcZ3/…
  • 我在控制台中遇到的错误是 imageData:::czsm imageData:::czsm10@gmail.com imageData:::Optional(0) 写入文档时出错:Optional(Error Domain=FIRAuthErrorDomain Code= 17014 "此操作很敏感,需要最近的身份验证。在重试此请求之前请重新登录。" UserInfo={NSLocalizedDescription=此操作很敏感,需要最近的身份验证。请在重试此请求之前重新登录。,error_name=ERROR_REQUIRES_RECENT_LOGIN})跨度>
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 2017-07-11
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多