2017-02-19 3 views
1

Ich versuche, diese Funktion Arbeit mit einem Fortschrittsbalken zu machen:Funktion mit einem CGFloat als Parameter

var progressTimer: Timer? 
var time: CGFloat = 0 

func setProgress(duration: CGFloat) { 
    time += 0.1 
    progressFront.progress = time/duration 
    if time >= duration { 
     progressTimer?.invalidate() 
    } 
} 

func updateProgress() { 
    progressTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: (#selector(ViewController.setProgress)), userInfo: nil, repeats: true) 
} 

func pauseUpdateProgress() { 
    progressTimer?.invalidate() 
} 

die Funktion wie folgt aufrufen und es does 't nur Arbeit:

setProgress(duration: 20) 

Während, wenn ich es wie folgt hartcode, funktioniert es ganz gut:

func setProgress() { 

      time += 0.1 
      progressFront.progress = time/20 

      if time >= 20 { 
       progressTimer?.invalidate() 
      } 
     } 

Was mache ich falsch?

+0

können Sie den gesamten Klassencode anzeigen? –

+1

Vielleicht nicht verwandt, aber vermeiden Sie Funktionsnamen, die mit 'set' beginnen. Sie könnten Eigentumseinrichter stören. Und wenn Sie die Funktion als Timer-Selektor verwenden, funktioniert das nicht, weil Sie die Timer-Instanz nur als Parameter übergeben können. – vadian

+0

@vadian Danke für deinen Rat und Kommentar. Ich benutze die Funktion scheinbar unangemessen als Timer-Selektor (aktualisiert den Code). Was kann ich tun, um diese Funktion wiederverwendbar zu machen? –

Antwort

1

Zuerst, wenn Sie einen Parameter in den Timer Handler haben, muss er die Timer selbst sein:

func setProgress(_ timer: Timer) { 
    ... 
} 

Zweitens sollte die #selector zeigen, was die Parameter der Methode sind, z.B. #selector(setProgress(_:)).

+0

Danke für den Vorschlag, aber wie kann ich setProgress() mit verschiedenen Parametern aufrufen, wenn ich etwas in den # Selektor hartcodiere. Ich möchte diese Funktion für mehrere Fortschrittsbalken verwenden. Ich bin neu im Programmieren, deshalb bin ich völlig verwirrt. Kannst du ein bisschen mehr Details geben? –

+1

Wenn Sie 'Timer' verwenden, steuern Sie nicht, was der Parameter des Selektors ist. Es wird immer der 'Timer' selbst sein. Wenn Sie Informationen an den Selektor übergeben möchten, liefern Sie (a) ein Wörterbuch an den 'userInfo' -Parameter von' terminatedTimer'; und (b) 'setProgress' kann dann diese' userInfo' abrufen. Oder, einfacher, verwenden Sie den blockbasierten ['terminatedTimer'] (https://developer.apple.com/reference/foundation/timer/2091889-scheduledtimer). – Rob

0

Die selector für eine Timer kann einen Parameter haben, aber dieser Parameter muss vom Typ Timer sein. Sie können die Dauer auf diese Weise nicht überschreiten.

aber das ist genau, warum es einen userInfo Parameter ist und Sie passieren kann:

... userInfo: ["duration": 20.0], repeats: true) 

Auch die wahrscheinlich nicht die beste Lösung für Sie ist, weil nach einer Pause, werden Sie die Dauer wieder passieren müssen.

Die einfachste Lösung ist das Speichern der Dauer in einer Eigenschaft.

var duration: CGFloat = 0 
+0

Danke. Können Sie bitte erläutern, wie ich diese einfache Lösung im Einzelfall einsetzen kann. Ich muss diese Funktion viele Male aufrufen. –