计时器完成块中的变量未更新
Variables are not updated in timer completion block
场景如下:
我想在页面显示后滚动(或摇动)水平 collectionView,以便用户可以看到它在滚动...
我在页面弹出 3 秒后没有问题,但我不希望它在用户在 2 秒前到达 collectionView 并自行滚动时跳起舞来。
所以这是我的解决方案:
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" 在 class 中更新得很好,但在计时器完成时它总是错误的!
这意味着 "collectionDidScroll" 没有完成更新并且它有它的启动时间值。
注意事项:
我的 class 是 UICollectionViewCell
的子class
我什至试过带计时器的 dispatchQueue 和带完成块的计时器,但结果是一样的
以上评论回答了您的问题,但为了帮助您以后自己解决类似问题:
每当您遇到此类问题时,您应该尝试在代码(尤其是 scrollViewDidScroll
和 showScrollTutorial
)中添加打印语句,以查看它们是否被调用以及它们包含哪些值。或者你可以设置断点!
问题已解决!
我在 'DispatchQueue' 中放置了 'showScrollTutorial()' 函数内容以强制它在主线程中成为 运行,现在它就像一个魅力!
谢谢大家。
场景如下:
我想在页面显示后滚动(或摇动)水平 collectionView,以便用户可以看到它在滚动...
我在页面弹出 3 秒后没有问题,但我不希望它在用户在 2 秒前到达 collectionView 并自行滚动时跳起舞来。
所以这是我的解决方案:
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" 在 class 中更新得很好,但在计时器完成时它总是错误的! 这意味着 "collectionDidScroll" 没有完成更新并且它有它的启动时间值。
注意事项:
我的 class 是 UICollectionViewCell
的子class我什至试过带计时器的 dispatchQueue 和带完成块的计时器,但结果是一样的
以上评论回答了您的问题,但为了帮助您以后自己解决类似问题:
每当您遇到此类问题时,您应该尝试在代码(尤其是 scrollViewDidScroll
和 showScrollTutorial
)中添加打印语句,以查看它们是否被调用以及它们包含哪些值。或者你可以设置断点!
问题已解决!
我在 'DispatchQueue' 中放置了 'showScrollTutorial()' 函数内容以强制它在主线程中成为 运行,现在它就像一个魅力!
谢谢大家。