Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift performSelector:withObject:afterDelay:未按预期传递参数_Swift - Fatal编程技术网

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
创建动画?它似乎是为这个用例专门构建的。