2016-10-19 2 views
1

Ich versuche, eine Balkendiagrammansicht zu erstellen, um Delegat und Datenquelle zu dieser Diagrammansicht zu erstellen. Erstellen eines Protokolls für den Delegaten und die Datenquelle für das DiagrammMöchten Bargraph mit Delegate und Datasource mit Protokoll erstellen

protocol BarGraphDatasource{ 
    func grapgView(grapgView:BarGraph, numberOfItemsInGraph items:Int)->Int 
    func grapgView(grapgView: BarGraph, didSelectItemAtIndex index: Int) 
} 

// Bargraph View-Klasse ist wie unten

class BarGraph: UIScrollView { 


    var delegte: BarGraphDatasource! = nil{ 

     didSet{ 
      self.reloadGraph() 
     } 
    } 

    var barWidth : CGFloat = 24 { 

     didSet{ 
       self.reloadGraph() 
     } 
    } 
    var minimumSpacing : CGFloat = 10 { 

     didSet{ 
      self.reloadGraph() 
     } 
    } 

    var numberOfItems : Int = 0 { 
     didSet{ 
      self.reloadGraph() 
     } 
    } 
    var barColor : UIColor = UIColor.lightGrayColor() { 

     didSet{ 
      self.reloadGraph() 
     } 
    } 



    init() { 
     super.init(frame: CGRectZero) 
     self.reloadGraph() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
    } 
    func reloadGraph(){ 
     self.setContentSizeForGraph() 
    } 

    func setContentSizeForGraph() { 

     if self.numberOfItems > 0 { 
      self.contentSize = CGSizeMake((self.barWidth * CGFloat(self.numberOfItems) + self.minimumSpacing), self.frame.height); 
      var xValue:CGFloat = 0 
      for i in 1...self.numberOfItems { 
       xValue = xValue + CGFloat(CGFloat(i) + self.minimumSpacing) 
       print("xValue: \(xValue)") 
       let frame = CGRectMake(xValue, 0, self.barWidth, 50) 
       let barView = UIView(frame: frame) 
       barView.backgroundColor = self.barColor 
       self.addSubview(barView) 
      } 
     } 
    } 
} 

// Das ist meine Klasse Viewcontroller

class ViewController: UIViewController,BarGraphDatasource { 

    @IBOutlet weak var grapView : BarGraph? 

    var arrayItems: NSArray = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     arrayItems = [1,2,3,4,5] 
     grapView?.barWidth = 10; 
     grapView?.delegte = self; 

     grapView?.reloadGraph() 
    } 


    func grapgView(grapgView: BarGraph, numberOfItemsInGraph items: Int) -> Int { 
     return arrayItems.count // how can i pass this value to the graph view from here  ******* 
    } 
    func grapgView(grapgView: BarGraph, didSelectItemAtIndex index: Int) { 
     print(arrayItems[index]) // how can i call this method on click of bar view  ******* 
    } 

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


} 

// Hier kann ich nicht um die Grafik bekommen und nicht-Protokoll aufrufen Methoden in der ViewController-Klasse

numberOfItemsInGraph, wenn wir dies setzen will ich diesen Wert auf BarGraph in

didSelectItemAtIndex Diagramm übergeben, wie die Aktion ausgewählte Element

+0

Sie sagen: "Wie kann ich diesen Wert an die Graphansicht übergeben". Ist das nicht die "Rückkehr"? Da es sich um eine Delegate-Methode handelt, würde ich erwarten, dass sie von dem Objekt aufgerufen wird, das auf den Delegaten verweist. –

Antwort

0

Sie brauchen nicht zu geben, rufen reloadGraph() alle Zeiten. Wenn Sie den Delegierten zuweisen, wird er aufgerufen. Und Sie können es später explizit nennen.

2. Sie müssen diese Delegate-Methoden von irgendwo aus der BarGraph-Klasse aufrufen. Ich habe einige Codes geändert, bitte versuchen Sie es.

import UIKit 

protocol BarGraphDatasource{ 
    func grapgView(grapgView:BarGraph, numberOfItemsInGraph items:Int)->Int 
    func grapgView(grapgView: BarGraph, didSelectItemAtIndex index: Int) 
    func grapgView(grapgView: BarGraph, setHeightOfBarAtIndex index: Int)->CGFloat 
} 
// Bargraph View class is like below 

class BarGraph: UIScrollView{ 


    var delegte: BarGraphDatasource! = nil{ 

     didSet{ 
      self.reloadGraph() 
     } 
    } 

    var barWidth : CGFloat = 24 
    var minimumSpacing : CGFloat = 10 
    var numberOfItems : Int = 0 
    var barColor : UIColor = UIColor.lightGrayColor() 
    var barViews : [UIButton] = [] 


    init() { 
     super.init(frame: CGRectZero) 
     self.reloadGraph() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
    } 
    func reloadGraph(){ 
     numberOfItems = delegte!.grapgView(self, numberOfItemsInGraph: numberOfItems) 
     self.setContentSizeForGraph() 

    } 

    func setContentSizeForGraph() { 

     if self.numberOfItems > 0 { 

      self.contentSize = CGSizeMake((self.barWidth * CGFloat(self.numberOfItems) + self.minimumSpacing), self.frame.height); 
      var xValue:CGFloat = 0 

      for i in 1...self.numberOfItems { 
       xValue = xValue + CGFloat(CGFloat(i) + self.minimumSpacing + self.barWidth) 
       print("xValue: \(xValue)") 
       let frame = CGRectMake(xValue, self.layer.frame.size.height-delegte.grapgView(self, setHeightOfBarAtIndex: i-1), self.barWidth, delegte.grapgView(self, setHeightOfBarAtIndex: i-1)) 
       let barView = UIButton(frame: frame) 
       barView.backgroundColor = self.barColor 
       barViews.append(barView) 
       barView.addTarget(self, action: #selector(BarGraph.send_ButtonIndex(_:)), forControlEvents: UIControlEvents.TouchUpInside) 
       self.addSubview(barView) 
      } 
     } 
    } 

    func send_ButtonIndex(barView : UIButton) 
    { 

     delegte!.grapgView(self, didSelectItemAtIndex: barViews.indexOf(barView)!) 
    } 

} 

Dies ist die BarGraph-Klasse mit Datenquelle. Ich habe eine zusätzliche Delegiertenmethode zur besseren Verwendung implementiert. Und Viewcontroller-Code folgt.

import UIKit 

class ViewController: UIViewController,BarGraphDatasource { 

    @IBOutlet weak var grapView : BarGraph? 

    var arrayItems: NSArray = [] 
    var heightOfBars: [CGFloat] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     arrayItems = [1,2,3,4,5] 
     heightOfBars = [20,30,25,60,40] 
     grapView?.barWidth = 20; 
     grapView?.barColor = UIColor.brownColor() 
     grapView?.minimumSpacing = 15; 
     grapView?.delegte = self; 
    } 


    func grapgView(grapgView: BarGraph, numberOfItemsInGraph items: Int) -> Int { 
     return arrayItems.count //pass this value to the graph view from here  ******* 
    } 
    func grapgView(grapgView: BarGraph, didSelectItemAtIndex index: Int) { 
     print(arrayItems[index]) //call this method on click of bar view  ******* 
    } 

    func grapgView(grapgView: BarGraph, setHeightOfBarAtIndex index: Int) -> CGFloat 
    { 
     return heightOfBars[index] 
    } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 
+0

Ich habe Ihren Code in meinem Projekt verwendet, kann aber immer noch kein Diagramm erstellen. Hier ist Link zu meiner Demo-App https://www.dropbox.com/s/0eb8fri3miyqr45/HeaderContainer.zip?dl=0 –

+0

@pretam Vielen Dank –

+0

var delgte: BarGraphDatasource! = Nil { didSet { self.reloadGraph() } } –

Verwandte Themen