gpt4 book ai didi

ios - 改变不同变量的动画回调

转载 作者:搜寻专家 更新时间:2023-10-31 23:02:12 26 4
gpt4 key购买 nike

我有一个显示 View 并在指定时间间隔后自动消失的按钮。现在,如果在 View 已经可见时再次按下按钮,那么它应该消失并显示一个新 View ,并且重置新 View 的计时器。

在按下按钮时,我有以下代码:

func showToast() {
timer?.invalidate()
timer = nil

removeToast()

var appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var toAddView = appDelegate.window!

toastView = UIView(frame: CGRectMake(0, toAddView.frame.height, toAddView.frame.width, 48))
toastView.backgroundColor = UIColor.darkGrayColor()
toAddView.addSubview(toastView)

timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: Selector("removeToast"), userInfo: nil, repeats: false)

UIView.animateWithDuration(0.5, animations: { () -> Void in
self.toastView.frame.origin.y -= 48
})
}

要删除 toast ,我有以下代码:

func removeToast() {
if toastView != nil {
UIView.animateWithDuration(0.5,
animations: { () -> Void in
self.toastView.frame.origin.y += 48
},
completion: {(completed: Bool) -> Void in
self.toastView.removeFromSuperview()
self.toastView = nil
})
}
}

现在,尽管我每次都通过执行 timer.invalidate() 重置计时器,但我在 removeToast() 中收到了两次调用,它们删除了新插入的 View 。会不会是 UIView.animate 导致了问题,我不知道如何调试 removeToast() 的两个回调。显示该行为的演示项目是 here

注意: 我确实发现一些帖子说使用 dispatch_after() 而不是计时器,@jervine10 也提出了同样的要求,但这并不能满足我的需求。就好像我使用 dispatch_after 那么很难使 GCD 调用无效。有什么可以用 NSTimers 完成的吗?我认为 NSTimers 就是为此而设计的,但我做错了什么。

最佳答案

很抱歉没有看到您的示例项目,感谢您指引我去做。我可以清楚地看到问题出在哪里,解决方案也非常简单。将删除 toast 更改为:

func removeToast() {

guard let toastView = self.toastView else {
return
}

UIView.animateWithDuration(0.1,
animations: { () -> Void in
toastView.frame.origin.y += 48
},
completion: {(completed: Bool) -> Void in
toastView.removeFromSuperview()

if self.toastView == toastView {
self.toastView = nil
}
})
}

基本上,问题是您在动画 block 中捕获 self,而不是 toastView。因此,一旦动画 block 异步执行,它们将删除在上一个函数中设置的 toastView

解决方案很简单,也修复了可能的竞争条件,那就是将 toastView 捕获到一个变量中。最后,我们检查实例变量是否等于我们要删除的 View ,我们将其取消。

提示:考虑对toastView

使用 weak 引用

关于ios - 改变不同变量的动画回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32315097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com