Swift performSelector:withObject:afterDelay:未按预期传递参数
我正在使用Swift performSelector:withObject:afterDelay:未按预期传递参数,swift,Swift,我正在使用performSelector控制控制器中某些方法的执行时间。在本例中,我希望传递给animateIntroViews的参数是with的值,但它不是,而是一些巨大的负数,如-7878379202283 func runOnRenderAnimations() -> Void { perform(#selector(animateIntroViews), with: 0, afterDelay: 0.5) perform(#selector(anim
performSelector
控制控制器中某些方法的执行时间。在本例中,我希望传递给animateIntroViews
的参数是with
的值,但它不是,而是一些巨大的负数,如-7878379202283
func runOnRenderAnimations() -> Void {
perform(#selector(animateIntroViews), with: 0, afterDelay: 0.5)
perform(#selector(animateIntroViews), with: 1, afterDelay: 2.5)
}
@objc fileprivate func animateIntroViews(textPosition: Int) -> Void {
print(textPosition)
}
perform
不适用于Int
等基本类型的参数
更好的解决方案是使用DispatchQueue asyncAfter
。这允许您正常调用该方法
func runOnRenderAnimations() -> Void {
DispatchQueue.main.asyncAfter(deadline: now() + 0.5) {
self.animateIntroViews(textPosition: 0)
}
DispatchQueue.main.asyncAfter(deadline: now() + 2.5) {
self.animateIntroViews(textPosition: 1)
}
}
使用
perform
选择器,可以将参数作为NSNumber
而不是Int
传递,并将其作为Number
获取,然后在animateIntroViews
函数中将其转换为Int
例如:
func runOnRenderAnimations() -> Void {
perform(#selector(animateIntroViews), with: NSNumber(value: 0), afterDelay: 0.5)
perform(#selector(animateIntroViews), with: NSNumber(value: 1), afterDelay: 2.5)
}
@objc fileprivate func animateIntroViews(textPosition: NSNumber) -> Void {
print(textPosition.intValue)
}
虽然这是可行的,但最好避免这种情况,因为它使用了许多旧的Objective-C特性。即使在Objective-C中,您也会使用分派队列和async_after,而不是
perform
。是的,您是正确的。但是,如果要取消计时器功能,可以在perform
中轻松处理。您只需调用NSObject.cancelPreviousPerformRequests(目标:self,选择器:#选择器(animateIntroViews),对象:NSNumber(值:0))
。因此,我回答支持他的现有代码。根据您方法的名称,您似乎正在尝试触发定时动画,是否有任何原因无法使用UIView.animateKeyFrames
创建动画?它似乎是为这个用例专门构建的。