Swift侧栏菜单符合但不会出现

时间:2014-12-04 06:27:35

标签: swift

我一直按照本指南[https://www.youtube.com/watch?v=qaLiZgUK2T0]创建一个快速的侧边栏菜单:代码编译,没有错误...我必须在某处丢失一些简单的东西....菜单没有出现。请帮助我找到这个问题。

下面列出了三个文件中的菜单代码:

ViewController.swift:

import UIKit
class ViewController: UIViewController, SideBarDelegate {

var sideBar:SideBar = SideBar()

override func viewDidLoad() {
    super.viewDidLoad()

    sideBar = SideBar(sourceView: self.view, menuItems: ["first item","second item","third item"])

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func sideBarDidSelectButtonAtIndex(index: Int) {

}    
}        

SideBarTableViewController.swift:

    import UIKit

protocol SideBarTableViewControllerDelegate{
func sideBarControlDidSelectRow(indexPath:NSIndexPath);
}

class SideBarTableViewController: UITableViewController {

var delegate:SideBarTableViewControllerDelegate?
var tableData:Array<String> = []


override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return tableData.count;
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell

    if cell == nil{
        cell = UITableViewCell(style :UITableViewCellStyle.Default, reuseIdentifier: "Cell")
        // Configure the cell...
        cell!.backgroundColor = UIColor.clearColor()
        cell!.textLabel.textColor = UIColor.darkTextColor()

        let selectedView:UIView = UIView(frame: CGRect (x: 0, y:0, width: cell!.frame.size.width, height: cell!.frame.size.height))
        selectedView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.3)

        cell!.selectedBackgroundView = selectedView

    }

    cell!.textLabel.text = tableData[indexPath.row]

    return cell!
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
    return 45.0
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    delegate?.sideBarControlDidSelectRow(indexPath)
}

}

SideBar.swift

    import UIKit

@objc protocol SideBarDelegate{
    func sideBarDidSelectButtonAtIndex(index:Int)
    optional func sideBarWillClose()
    optional func sideBarWillOpen()
}

class SideBar: NSObject, SideBarTableViewControllerDelegate {
let barWidth : CGFloat = 150;
let sideBarTableViewTopInset:CGFloat = 64.0;
let sideBarContainerView: UIView = UIView()
let sideBarTableViewController: SideBarTableViewController = SideBarTableViewController()
let orginView : UIView!
var animator: UIDynamicAnimator!
var delegate:SideBarDelegate?
var isSideBarOpen:Bool = false

override init(){
    super.init()
}

init(sourceView: UIView, menuItems:Array<String>){
    super.init()
    orginView = sourceView
    sideBarTableViewController.tableData = menuItems

    animator = UIDynamicAnimator(referenceView: orginView)

    let showGestureRecognizer:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: "handleSwipe:")
    showGestureRecognizer.direction = UISwipeGestureRecognizerDirection.Right
    orginView.addGestureRecognizer(showGestureRecognizer)

    let hideGesturerecognizer:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: "handleSwipe:")
    hideGesturerecognizer.direction = UISwipeGestureRecognizerDirection.Left
    orginView.addGestureRecognizer(hideGesturerecognizer)

}

func setupSideBar(){
    sideBarContainerView.frame = CGRectMake(-barWidth - 1,orginView.frame.origin.y, barWidth, orginView.frame.size.height)
    sideBarContainerView.backgroundColor = UIColor.clearColor()
    sideBarContainerView.clipsToBounds = false

    orginView.addSubview(sideBarContainerView)

    let blurView:UIVisualEffectView = UIVisualEffectView(effect:
        UIBlurEffect(style: UIBlurEffectStyle.Light))
    blurView.frame = sideBarContainerView.bounds
    sideBarContainerView.addSubview(blurView)

    sideBarTableViewController.delegate = self
    sideBarTableViewController.tableView.frame = sideBarContainerView.bounds
    sideBarTableViewController.tableView.clipsToBounds = false
    sideBarTableViewController.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
    sideBarContainerView.backgroundColor = UIColor.clearColor()
    sideBarTableViewController.tableView.scrollsToTop = false

    sideBarTableViewController.tableView.contentInset = UIEdgeInsetsMake(sideBarTableViewTopInset, 0,0,0)

    sideBarTableViewController.tableView.reloadData()

    sideBarContainerView.addSubview(sideBarTableViewController.tableView)

}

func handleSwipe(recognizer:UISwipeGestureRecognizer){
    if (recognizer.direction == UISwipeGestureRecognizerDirection.Left){
        showSideBar(false)
        delegate?.sideBarWillClose?()
    }else{
        showSideBar(true)
        delegate?.sideBarWillClose?()
    }
}

func showSideBar(shouldOpen:Bool){
    animator.removeAllBehaviors()
    isSideBarOpen = shouldOpen

    let gravityX:CGFloat = (shouldOpen) ? 0.5 : -0.5
    let magnitude:CGFloat = (shouldOpen) ? 20 : -20
    let boundryX: CGFloat = (shouldOpen) ? barWidth : -barWidth - 1

    let gravityBehavior:UIGravityBehavior = UIGravityBehavior(items: [sideBarContainerView])
    gravityBehavior.gravityDirection = CGVectorMake(gravityX, 0)

    let collisonBehavior:UICollisionBehavior = UICollisionBehavior(items: [sideBarContainerView])

    collisonBehavior.addBoundaryWithIdentifier("sideBarBoundary", fromPoint: CGPointMake(boundryX, 20), toPoint: CGPointMake(boundryX, orginView.frame.size.height))

    animator.addBehavior(collisonBehavior)

    let pushBehavior:UIPushBehavior = UIPushBehavior(items: [sideBarContainerView], mode: UIPushBehaviorMode.Instantaneous)
    animator.addBehavior(pushBehavior)

    let sideBarBehavior:UIDynamicItemBehavior = UIDynamicItemBehavior(items: [sideBarContainerView])
    sideBarBehavior.elasticity = 0.3
    animator.addBehavior(sideBarBehavior)
}

func sideBarControlDidSelectRow(indexPath: NSIndexPath) {
    delegate?.sideBarDidSelectButtonAtIndex(indexPath.row)
}
}

1 个答案:

答案 0 :(得分:0)

当你下载源代码时,我经历并调试了项目文件,而为了让它工作,我所做的就是对SideBarTableViewController.swift做一些小改动,一切都适合我。这是:

import UIKit


protocol SideBarTableViewControllerDelegate{
    func sideBarControlDidSelectRow(indexPath:NSIndexPath)
}

class SideBarTableViewController: UITableViewController {

    var delegate:SideBarTableViewControllerDelegate?
    var tableData:Array<String> = []


    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return tableData.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell

        if cell == nil{
            cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
            // Configure the cell...

            cell?.backgroundColor = UIColor.clearColor()
            cell?.textLabel?.textColor = UIColor.darkTextColor()

            let selectedView:UIView = UIView(frame: CGRect(x: 0, y: 0, width: cell!.frame.size.width, height: cell!.frame.size.height))
            selectedView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.3)

            cell!.selectedBackgroundView = selectedView
        }
        cell?.textLabel?.text = tableData[indexPath.row]
        return cell!

    }

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 45.0
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        delegate?.sideBarControlDidSelectRow(indexPath)

    }

}