簡體   English   中英

ViewController不符合Swift上的協議

[英]ViewController does not conform to protocol on Swift

我在班上打電話給代表時遇到了問題。 我有一個SideBarTableController和SideBar.swift文件。它正常工作,直到我注銷並重新進入。這是代碼。 它一直告訴我'ViewController'不符合協議'SideBarDelegate'。 如果這是模糊的話,我是編程的新手,所以提前對不起。 什么都有幫助謝謝!

import UIKit
import iAd

class ViewController: UIViewController, SideBarDelegate {  -----This is where the error is happening


@IBOutlet var menuTab: UIButton!        // Menu Tab
@IBOutlet var businessButton: UIButton! // Business Button
@IBOutlet var adBanner: ADBannerView!   // Banner Ad
@IBOutlet var imageView: UIImageView!   // Main Image in middle
var topHeader: UIImageView!             // Utility header

var sideBar:SideBar = SideBar()         // Side Bar


override func viewDidLoad() {
    super.viewDidLoad()



    // Function for menu
   // menuTab.addTarget(self, action: "buttonPressed", forControlEvents: UIControlEvents.TouchUpInside)
    func menuTab(sender: UIButton){
        sideBar = SideBar(sourceView: self.view, menuItems: ["Home", "Business Directory", "Classifieds", "Featured News", "Jobs", "Restaurants", "Sports"])
        sideBar.delegate = self        }

    // Gives the screen dimensions
    let screenSize: CGRect = UIScreen.mainScreen().bounds
    let screenWidth = screenSize.width
    let screenHeight = screenSize.height


    // Side bar action and text
    sideBar = SideBar(sourceView: self.view, menuItems: ["Home", "Business Directory", "Classifieds", "Featured News", "Jobs", "Restaurants", "Sports"])
    sideBar.delegate = self


    // Utility Background
    var topHeader = UIView(frame: CGRectMake(0, 0, screenWidth, 17))
    topHeader.backgroundColor = UIColor(white: 0.0, alpha: 1.0)
    self.view.addSubview(topHeader)
}

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

// Side Bar funcion
func sideBarDidSelectButtonAtIndex(index: Int) {
    if index == 0{
        imageView.backgroundColor = UIColor.redColor()
        imageView.image = nil
    } else if index == 1{
        imageView.backgroundColor = UIColor.clearColor()
        imageView.image = UIImage(named: "image2")
    }
}
// Status bar style (white)
override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return UIStatusBarStyle.LightContent
}


}

這是我調用SideBarDelegate的地方

import UIKit

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

class SideBar: NSObject, SideBarTableViewControllerDelegate {

    let barWidth:CGFloat = 176.0
    let sideBarTableViewTopInset:CGFloat = 64.0
    let sideBarContainerView:UIView = UIView()
    let sideBarTableViewController:SideBarTableViewController = SideBarTableViewController()
    let originView:UIView!

    var animator:UIDynamicAnimator!
    var delegate:SideBarDelegate?
    var isSideBarOpen:Bool = false

    override init() {
        super.init()
    }

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

        setupSideBar()

        animator = UIDynamicAnimator(referenceView: originView)

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

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


    }


    func setupSideBar(){

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

        originView.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
        sideBarTableViewController.tableView.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?.sideBarWillOpen()
        }

    }


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

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


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

        let collisionBehavior:UICollisionBehavior = UICollisionBehavior(items: [sideBarContainerView])
        collisionBehavior.addBoundaryWithIdentifier("sideBarBoundary", fromPoint: CGPointMake(boundaryX, 20), toPoint: CGPointMake(boundaryX, originView.frame.size.height))
        animator.addBehavior(collisionBehavior)

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


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

    }

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

}

您的SideBarDelegate協議指定了必須實現的一些方法,以符合該協議。 因此,請查看該協議的定義,確定其中定義的方法,然后在ViewController類中實現它們。

您可能錯過了該協議中定義的某個函數,或者您可能在sideBarDidSelectButtonAtIndex的定義中sideBarDidSelectButtonAtIndex錯誤的sideBarDidSelectButtonAtIndex 如果沒有看到這個協議的定義,我們不能說。


更新:

您隨后提供了協議的定義。 它定義了兩個您未在視圖控制器中實現的附加功能:

func sideBarWillClose()
func sideBarWillOpen()

您還必須在視圖控制器中實現這兩個功能(即使您沒有放入任何內容)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM