Closed diogo10 closed 8 years ago
Yes this can be done although it is quite complex.
First begin by creating a protocol in which you can delegate all the methods which normally reside on the AppDelegate
protocol ExternalDrawerDelegate {
// Methods that must be delegated
var centerViewController: UIViewController { get set }
func rightViewController() -> UIViewController
func leftViewController() -> UIViewController
func toggleLeftDrawer(sender:AnyObject, animated:Bool)
func toggleRightDrawer(sender:AnyObject, animated:Bool)
// App Specific Delegation
func drawerSettingsViewController() -> UIViewController
func sourcePageViewController() -> UIViewController
}
The view controller which the KGFloatingDrawer would be attached to would look something like this
class ViewController: UIViewController, ExternalDrawerDelegate {
let kKGDrawersStoryboardName = "Drawers"
let kKGDrawerSettingsViewControllerStoryboardId = "KGDrawerSettingsViewControllerStoryboardId"
let kKGDrawerWebViewViewControllerStoryboardId = "KGDrawerWebViewControllerStoryboardId"
let kKGLeftDrawerStoryboardId = "KGLeftDrawerViewControllerStoryboardId"
let kKGRightDrawerStoryboardId = "KGRightDrawerViewControllerStoryboardId"
private var _drawerViewController: KGDrawerViewController?
var drawerViewController: KGDrawerViewController {
get {
if let viewController = _drawerViewController {
return viewController
}
return prepareDrawerViewController()
}
}
func prepareDrawerViewController() -> KGDrawerViewController {
let drawerViewController = KGDrawerViewController()
drawerViewController.centerViewController = drawerSettingsViewController()
drawerViewController.leftViewController = leftViewController()
drawerViewController.rightViewController = rightViewController()
drawerViewController.backgroundImage = UIImage(named: "sky3")
_drawerViewController = drawerViewController
return drawerViewController
}
private func drawerStoryboard() -> UIStoryboard {
let storyboard = UIStoryboard(name: kKGDrawersStoryboardName, bundle: nil)
return storyboard
}
private func viewControllerForStoryboardId(storyboardId: String) -> UIViewController {
let viewController: UIViewController = drawerStoryboard().instantiateViewControllerWithIdentifier(storyboardId)
return viewController
}
func drawerSettingsViewController() -> UIViewController {
let viewController = viewControllerForStoryboardId(kKGDrawerSettingsViewControllerStoryboardId) as! UINavigationController
let settings = viewController.topViewController as! KGDrawerSettingsTableViewController
settings.extDelegate = self
return viewController
}
func sourcePageViewController() -> UIViewController {
let viewController = viewControllerForStoryboardId(kKGDrawerWebViewViewControllerStoryboardId) as! UINavigationController
let sourcePage = viewController.topViewController as! KGDrawerWebViewViewController
sourcePage.extDelegate = self
return viewController
}
func leftViewController() -> UIViewController {
let viewController: LeftDrawerTableViewController = viewControllerForStoryboardId(kKGLeftDrawerStoryboardId) as! LeftDrawerTableViewController
viewController.extDelegate = self;
return viewController
}
func rightViewController() -> UIViewController {
let viewController = viewControllerForStoryboardId(kKGRightDrawerStoryboardId)
return viewController
}
func toggleLeftDrawer(sender:AnyObject, animated:Bool) {
_drawerViewController?.toggleDrawer(.Left, animated: true, complete: { (finished) -> Void in
// do nothing
})
}
func toggleRightDrawer(sender:AnyObject, animated:Bool) {
_drawerViewController?.toggleDrawer(.Right, animated: true, complete: { (finished) -> Void in
// do nothing
})
}
private var _centerViewController: UIViewController?
var centerViewController: UIViewController {
get {
if let viewController = _centerViewController {
return viewController
}
return drawerSettingsViewController()
}
set {
if let drawerViewController = _drawerViewController {
drawerViewController.closeDrawer(drawerViewController.currentlyOpenedSide, animated: true) { finished in }
if drawerViewController.centerViewController != newValue {
drawerViewController.centerViewController = newValue
}
}
_centerViewController = newValue
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.addSubview(self.drawerViewController.view)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
notice the delegation set in the various view controllers that would be presented as content, and also the left and right view controllers. If the left view controller was a table view it may look something like this
class LeftDrawerTableViewController: UITableViewController {
var extDelegate: ExternalDrawerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: <TableViewDataSource>
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.row == 2 {
extDelegate?.centerViewController = (extDelegate?.sourcePageViewController())!
} else if indexPath.row == 3 {
extDelegate?.centerViewController = (extDelegate?.drawerSettingsViewController())!
}
}
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.backgroundColor = UIColor.clearColor()
}
}
And the content view controller (which is a web view controller inside a navigation view controller on the storyboard) would look something like this.
class KGDrawerWebViewViewController: UIViewController {
@IBOutlet weak var webView: UIWebView!
var extDelegate : ExternalDrawerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let url: NSURL = NSURL(string: "https://github.com/KyleGoddard/KGFloatingDrawer")!
let request = NSURLRequest(URL: url)
webView.loadRequest(request)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
@IBAction func toggleLeftDrawer(sender: AnyObject) {
extDelegate?.toggleLeftDrawer(sender, animated: false)
}
@IBAction func toggleRightDrawer(sender: AnyObject) {
extDelegate?.toggleRightDrawer(sender, animated: true)
}
}
Hope you find this helpful.
Lovely KyleGoddard ! Thanks a lot
This is very helpful. Thanks!
I would use it in one view that is not the mainScreen(in my case one third viewController). Is it possible? I have been tried but I couldn't find out how to do that. The menu just pop up if I use....