Swift 没有故事板的 SWRevealController

Swift SWRevealController without storyboard

我用故事板实现了 SWRevealController 并且一切正常,但现在我想在没有故事板的情况下编写应用程序。

有人可以帮我实现吗?我有一个 FrontViewController 和一个 MenuViewController。为此,我是否需要一个额外的 SWRevealViewController?如果需要,我需要编写什么代码?

我知道 SWRevealController 上有一些信息,但它在 Objective-C 中,我在 Swift 2.0.

中写这个时遇到一些问题

您可以按照下面的方式进行。

在 appDelegate 中创建一个函数 createSlidingMenu

func createSlidingMenu(){

        let frontViewController = //create instance of frontVC
        let rearViewController  = //create instance of rearVC(menuVC)


        //create instance of swRevealVC based on front and rear VC
        let swRevealVC = SWRevealViewController(rearViewController: rearViewController, frontViewController: frontViewController);
        swRevealVC.toggleAnimationType = SWRevealToggleAnimationType.EaseOut;
        swRevealVC.toggleAnimationDuration = 0.30;

        //set swRevealVC as rootVC of windows
        self.window?.rootViewController = swRevealVC!;
}

application:didFinishLaunchingWithOptions: 中致电 createSlidingMenu,一切顺利。

这对我有用(在 swift 3.1 中)

  1. 在 StoryBoard 中创建 MasterViewController、HomeViewController(嵌入在 UINavigationController 中)和 storyboardId "HomeViewController",以及 MenuViewController(嵌入在 UINavigationController 中)和 storyboardId "MenuViewController"。
  2. 创建 MasterViewController class 并关联到 Storyboard 中的 UIViewController (MasterViewController) 并实现 SWRevealViewControllerDelegate 协议(见代码)

    import UIKit
    
    class MasterViewController: UIViewController, SWRevealViewControllerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let frontNavigationController:UINavigationController
        let rearNavigationController:UINavigationController
        let revealController = SWRevealViewController()
        var mainRevealController = SWRevealViewController()
    
        let menuTable = self.storyboard?.instantiateViewController(withIdentifier:  "MenuViewController")as! MenuViewController
        let homepage = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
    
        frontNavigationController =  UINavigationController(rootViewController: homepage)
        rearNavigationController =  UINavigationController(rootViewController: menuTable)
        rearNavigationController.setNavigationBarHidden(true, animated: false)
    
        revealController.frontViewController = frontNavigationController
        revealController.rearViewController = rearNavigationController
        revealController.delegate = self
        mainRevealController  = revealController
    
        UIApplication.shared.delegate!.window?.rootViewController = mainRevealController
    }
    

    }

  3. 作为替代方案,您可以省略 MasterViewController 并且:

    • 在 AppDelegate 中实现 SWRevealViewControllerDelegate 和
    • 复制上面application:didFinishLaunchingWithOptions中写的viewDidLoad body的代码:

除了Hitendra,我修改了下面的代码,这样我就可以把导航放到首页了

AppDelegate.swift

func toHome() {
    let frontViewController = HomeController()//create instance of frontVC
    let rearViewController  = MenuController() //create instance of rearVC(menuVC)

    let swRevealVC = SWRevealViewController(rearViewController: rearViewController, frontViewController: frontViewController);
    swRevealVC?.toggleAnimationType = SWRevealToggleAnimationType.easeOut;
    swRevealVC?.toggleAnimationDuration = 0.30;

    navigationController = UINavigationController(rootViewController: swRevealVC!)
    self.window?.rootViewController = navigationController
}

LoginController.swift,当用户点击登录按钮时

@objc private func login() {
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     appDelegate.toHome()
     return
}

HomeController.swift

override func viewDidLoad() {
    super.viewDidLoad()

    setupLayout() // layout programmatically, I didn't put code here

    let menuButton = UIBarButtonItem(title: "Menu", style: .plain, target: self, action: #selector(HomeController.menu))
    self.revealViewController().navigationItem.leftBarButtonItem = menuButton

}

@objc private func menu() {
    revealViewController().revealToggle(self)
}