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 中)
- 在 StoryBoard 中创建 MasterViewController、HomeViewController(嵌入在 UINavigationController 中)和 storyboardId "HomeViewController",以及 MenuViewController(嵌入在 UINavigationController 中)和 storyboardId "MenuViewController"。
创建 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
}
}
作为替代方案,您可以省略 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)
}
我用故事板实现了 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 中)
- 在 StoryBoard 中创建 MasterViewController、HomeViewController(嵌入在 UINavigationController 中)和 storyboardId "HomeViewController",以及 MenuViewController(嵌入在 UINavigationController 中)和 storyboardId "MenuViewController"。
创建 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 }
}
作为替代方案,您可以省略 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)
}