2017-12-27 18 views
0

私は、Intsの配列をループする関数を用意しようとしています。その値に応じて各項目に対して、メッセージを消してから、配列内の次の項目に移動します。 DISPATCHを使って消えるメッセージの「遅延」を作り出す方法を見つけ出すことができました。しかし、私はまだすべてのメッセージが一気に現れてしまっています。スワイプループを1つ1つずつ入れて、間にポーズを入れてください

私は、forループの最後にDISPATCHを使用して呼び出しようとしているすべてのメッセージをオフにする "offAll()"という関数を作成しましたが、私が言ったように、それはまだ表示されています一度にすべてのメッセージ。 (私はDISPATCHステートメントをそれぞれのcaseステートメントに個別に入れようとしましたが、どちらも役に立ちませんでした。)

参考までに、私はXCodeでSwift 4を使用しています。ありがとうございました!!

func popUp(){ 
    for item in order{ 
     if item == 0 { 
      firstLabel.text = "ME!" 
     } else if item == 1 { 
      secondLabel.text = "ME!" 
     } else if item == 2 { 
      thirdLabel.text = "ME!" 
     } else { 
      fourthLabel.text = "ME!" 
     } 
     DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 
      self.offAll() 
     } 

    } 
+1

関数の先頭にブレークポイントを置き、最後までブレークポイントを進めます。それは、うまくいけば、なぜそれらがすべて一度に現れているのかをあなたに明かにしておくはずです。 –

+1

もう一つの役に立つ考え。 「ME!」と言っている4つのポップオーバーがある場合、おそらく、ラベルテキストにそれらの4つのうちの何か異なるものがあるはずです - それは他の問題を排除するのに役立ちます。 – dfd

答えて

2

forサイクルは非同期ではなく、一時停止していないため、すべてのメッセージが一緒に表示されます。解決策は、タイマーを使用して各メッセージを遅延させることです。 このタイマーは、メッセージの表示を開始したい場所で呼び出すことができます。 私はオーダーが配列であると仮定しています。

var item = 0 
    let popUpTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { timer in 
     //removes all popups 
     self.offAll() 
     if item == 0 { 
      firstLabel.text = "ME!" 
     } else if item == 1 { 
      secondLabel.text = "ME!" 
     } else if item == 2 { 
      thirdLabel.text = "ME!" 
     } else { 
      fourthLabel.text = "ME!" 
     } 
     item = item + 1 
     if item >= order.count { //not order.count - 1 so the last popup can be removed 
      //stops the timer when all popups are shown 
      timer.invalidate() 
     } 
    }) 

これは毎秒ポップアップを表示し、次のポップアップを表示してから次のポップアップを表示します。

+0

ありがとう!これはとても役に立ちました! –

関連する問題