2017-12-07 2 views
1

In meiner App möchte ich ein Array von Strings animieren, um den Benutzern Anweisungen zu geben. Meine Erwartung ist, dass die erste Saite eingeblendet wird, für Sekunden gehalten wird und dann ausblendet, dann wird die erste Saite aus dem Array entfernt und die nächste Saite usw., bis das Array leer ist. Es ist etwas falsch mit meiner Implementierung ist jedoch, es zu debuggen schwer ist (es scheint, würde das Programm nicht Zeile für Zeile durchgeführt werden), hier ist mein Code:swift: rekursive Animation

var text = [Text.text1, Text.text2] 
@IBOutlet weak var paragraph: UILabel! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    paragraph.alpha = 0 
    showText(text: text) 
} 

private func showText(text: [String]) { 
    if text.first == nil { 
     return 
    } else { 
     paragraph.text = text.first 
     UIView.animate(withDuration: 1.5, delay: 1.5, options: .curveEaseInOut, animations: { 
      self.paragraph.alpha = 1 
     }, completion: { (_) in 
      UIView.animate(withDuration: 1.5, delay: 0.5, options: .curveEaseInOut, animations: { 
       self.paragraph.alpha = 0 
      }, completion: { (_) in 
       self.text.remove(at: 0) 
       self.showText(text: text) 
      }) 
     }) 
    } 
} 

Das Problem ist die erste Saite zeigt dreimal und ich dann einen Index außerhalb des Bereichsfehlers erhalten. Wenn ich versuche, Breakpoints zu setzen und auf "Weiter" zu klicken, werden die Animations- und Completion-Blöcke übersprungen, und ich weiß nicht, wie man eine Funktion mit einem Block als Parameter debuggt. Und auch obwohl ich

paragraph.text = text.first 

nach der ersten Runde habe, hat paragraph.text die zweite Saite gewesen, aber nach wie vor die erste Saite zeigt. Und es scheint, dass meine Abbruchbedingung nicht funktioniert: Nach zwei Iterationen ich die Zählung des self.text Array bemerkt habe, hat 0 geworden, aber die Funktion nicht zurückkehrte, geht es um anderes ...

if text.count == 0 { 
      return 
     } else { ... } 

Ich bin ein Neuling und weiß nicht, wie man Blöcke debuggt ...

+1

Haben Sie versucht, dies mit Breakpoints debuggen? –

+1

Was genau stimmt nicht? – rmaddy

+0

@ZonilyJame Ich habe versucht mit Breakpoints, aber ich weiß nicht, wie man mit Blöcken als Parameter einer Funktion umgehen ... –

Antwort

1

Das Problem ist subtil und es ist alles im zweiten Abschlussblock. Sie haben:

self.text.remove(at: 0) 
self.showText(text: text) 

Sie die text Eigenschaft aktualisieren, aber Sie dann den lokalen text Parameter übergeben, die nicht verändert wurde.

Ändern Sie die zweite Zeile, um self.text anstelle von nur text zu übergeben.

Aber self.text innerhalb showText Referenzierung negiert die text Parameter selbst müssen müssen. Entweder schreibe showText, um nur die text Eigenschaft der Klasse oder besser zu verwenden, referenziere nur den Parameter text. Letzteres hat den Vorteil, die Eigenschaft nicht zu verändern.

letztere Option zu implementieren, die beiden Linien von im zweiten Abschluss Block ändern:

self.text.remove(at: 0) 
self.showText(text: text) 

nur:

self.showText(text: Array(text[1...]))