Swift: цикл по массиву и представление информации о экране за элементом (с обновлением экрана) - PullRequest
0 голосов
/ 09 июня 2019

Я храню информацию в массиве и хочу представить ее на UIButton / UILabel на экране один за другим со временем ожидания, равным одной секунде.

Конечно, система умна и рассчитывает все функции перед обновлением экрана для экономии ресурсов ... как я могу предотвратить это и обновлять экран после запуска каждого элемента?(Я использую UIKit, а не SpriteKit).

 @objc private func infoButtonTapped(_ sender: Any) {

      for item in Array {
          statusButton.isHidden = true
         updateScreen()
          presentArray(item: item)
         sleep(1)
      }
}

  func presentArray(item: ArrayItem) {

      statusButton.isHidden = false
      statusButton.titleLabel?.text = item.status

  }

Я пытался

    view.setNeedsLayout()

и устанавливал определенные детали в

      DispatchQueue.main.async { xxx }

, но не из этих уловокработать ...

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Возможным решением может быть использование scheduleTimer для обновления вашей кнопки или ярлыка следующим образом:

let sampleArray = [0,1,2,3,4,5,6,7,8,9,10]
var numberOfItem = 10
var sampleTimer:Timer!

override func viewDidLoad() {
    super.viewDidLoad()

    sampleTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(presentArray), userInfo: nil, repeats: true)
}

@objc func presentArray(){

    if numberOfItem >= 0 {
        sampleButton.setTitle(String(sampleArray[numberOfItem]), for: .normal)
        numberOfItem -= 1
    }
    else {
        sampleTimer.invalidate()
    }
}
0 голосов
/ 09 июня 2019

Я решил это, установив содержимое infoButtonTabbed в:

 DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default).async { xxx }

и содержимое presentArray в

 DispatchQueue.main.async { xxx }

теперь он перебирает массив, представляющий один элемент за другим.

...