Переменные не обновляются в блоке завершения таймера - PullRequest
0 голосов
/ 10 ноября 2019

Вот сценарий:

Я хочу прокрутить (или встряхнуть) горизонтальную коллекцию ViewView после отображения страницы, чтобы пользователь мог видеть ее прокрутку ...

Я делаю это без проблем через 3 секунды после всплывающего окна, но я не хочу, чтобы он исполнял танец, когда пользователь достигает элемента collectionView до 2 секунд и сам прокручивает его.

Так вот мойрешение для этого:

   var collectionDidScroll = false

   func scrollViewDidScroll(_ scrollView: UIScrollView) {
        collectionDidScroll = true
   }

   override func awakeFromNib() {
        super.awakeFromNib()
        Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(showScrollTutorial), userInfo: nil, repeats: false)
   }

   @objc func showScrollTutorial() {
        if !collectionDidScroll {
            collectionView.shakeCells()
        }
   }

Проблема:

«collectionDidScroll» обновляется просто отлично в классе, но при завершении таймера всегда ложно! Это означает, что «collectionDidScroll» не обновляется по завершении и имеет значение времени запуска.

Примечание:

Мой класс является подклассом UICollectionViewCell

Я даже пробовал dispatchQueue с таймером и таймером с блоком завершения, но результаты те же

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Проблема решена!

Я поместил содержимое функции showScrollTutorial () внутри DispatchQueue, чтобы заставить его работать в главном потоке, теперь он работает как шарм!

Спасибо всем.

0 голосов
/ 10 ноября 2019

Комментарии выше ответили на ваш вопрос, но чтобы помочь вам самостоятельно решить подобные проблемы в будущем:

Всякий раз, когда у вас возникают подобные проблемы, вы должны пытаться засорять свой код (особенно scrollViewDidScroll и showScrollTutorial). ) с оператором print, чтобы увидеть, вызваны ли они вообще и какие значения они содержат. Или вы можете установить точки останова!

...