2017-12-27 7 views
0

저는 Ints 배열을 통해 반복되는 함수를 갖기 위해 각 항목에 대해 값에 따라 잠시 동안 특정 메시지를 팝업하거나 메시지를 사라지게 한 다음 배열의 다음 항목으로 이동하십시오. 나는 DISPATCH를 사용하여 사라지는 메시지에 대한 "지연"을 만드는 방법을 알아낼 수있었습니다. 그러나 나는 한꺼번에 모든 메시지가 나타나기까지했습니다.배열을 통해 스위프트 루프를 하나씩 차례로 반복합니다.

별도로 "forAfter"의 끝에 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

정말 고마워요! 이것은 매우 도움이되었다! –

관련 문제