2016-06-18 10 views
0

Ich habe einen folgenden Code, der Kakao Touch-Klasse ist, die ein einfaches Tortendiagramm zeichnet, und mit dem Wert CGFloat kann ich das Bild anpassen, um die richtige Menge an Pie anzuzeigen.Wie man Wert zwischen Klassen übergibt -

Wie kann ich einen Wert zum Beispiel von einem Schieberegler in der Hauptansicht controler.swift übergeben, anstatt ihn zu fixieren?

public class PieChart : NSObject { 



    public class func drawCanvas1(ratio ratio: CGFloat = 0.75) { 

     //// Variable Declarations 
     let expression: CGFloat = 90 + ratio * 360 


     let ovalPath = UIBezierPath(ovalInRect: CGRect(x: 0, y: -0, width: 112, height: 112)) 
     UIColor.blackColor().setFill() 
     ovalPath.fill() 



     let oval2Rect = CGRect(x: 4, y: 4, width: 104, height: 104) 
     let oval2Path = UIBezierPath() 
     oval2Path.addArcWithCenter(CGPoint(x: oval2Rect.midX, y: oval2Rect.midY), radius: oval2Rect.width/2, startAngle: -expression * CGFloat(M_PI)/180, endAngle: -90 * CGFloat(M_PI)/180, clockwise: true) 
     oval2Path.addLineToPoint(CGPoint(x: oval2Rect.midX, y: oval2Rect.midY)) 
     oval2Path.closePath() 

     UIColor.redColor().setFill() 
     oval2Path.fill() 
    } 
} 

und das ist mein ViewController.swift

import UIKit 

class ViewController: UIViewController { 


    @IBOutlet weak var sliderValue: UISlider! 


    @IBAction func sliderMoved(sender: UISlider) { 

     let mySliderValue = sliderValue.value 

// das ist, wo ich bin stecken ->

 drawCanvas1 = Float(mySliderValue) 


} 

EDIT: Code hinzugefügt, von wo Piechart Initialised ist

import UIKit 


@IBDesignable 


class PCView: UIView { 

    /* 
    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func drawRect(rect: CGRect) { 
     // Drawing code 
    } 
    */ 
    override func drawRect(rect: CGRect) { 

     PieChart.drawCanvas1() 

    } 

} 
+0

Sie benötigen einen Verweis auf 'PieChart' in' ViewController'. Wie und wo wird 'PieChart' initialisiert? – vadian

+0

ok - also würde ich PieChat wie folgt referenzieren? var sliderUpdate = PieChart! ? – PappaGee

+0

Code hinzugefügt von dem PieChart initialisiert wird - – PappaGee

Antwort

0

Sie könnten einen Delegaten p einrichten attern, um Daten zwischen den UIView und ViewController mit zwei Protokollen zu übergeben.

protocol IsChart { 
    var delegate: ChartDelegate? { get set } 
    var ratio: CGFloat { get set } 
} 

protocol ChartDelegate: class { 
    var pcView: PCView! { get } 
} 

Die PCView würde IsChart entsprechen und die ViewController zu ChartDelegate entsprechen würde. So stellen Sie sicher, dass, wenn Sie initialisieren die PCView in der ViewController Sie setzen ihre delegate Eigenschaft auf self (Die ViewController) und Sie den initialisierten PCView als pcView Eigenschaft des ViewController hinzuzufügen. In der @IBAction für die UISlider müssen Sie die pcView s ratio Eigenschaft auf slider.value setzen und dann pcView.setNeedsDisplay() ausführen.

Hinweise:

  1. Das Verhältnis Eigenschaft würde zu drawCanvas1 weitergegeben werden.
  2. können Sie mehr über die Implementierung der Delegat Muster und Protokolle hier lesen: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

Wenn Sie Fragen haben, wenden Sie sich bitte: D.

+0

Sie sind richtig @vadian. Ich habe es entsprechend bearbeitet. Aber es sollte beachtet werden, dass die Werte jetzt eingestellt werden müssen. Wenn sie es sind, wird es zur Laufzeit abstürzen. – Ike10

+0

Eine nicht optionale Variable muss per Definition einen Standardwert haben. Der Code wird sonst nicht kompiliert. Das ist der Vorteil des starken Typsystems. – vadian

+0

Könnte es implizit unverpackte Optionen verwenden und die Werte setzen und die pcview in viewDidLoad initialisieren? @vadian – Ike10

Verwandte Themen