显然以下内容在swift中不再可用:
[self performSelector:@selector(onFlip) withObject:nil afterDelay:0.3];
Run Code Online (Sandbox Code Playgroud)
如果仍然存在以下情况,为什么会这样:
NSObject.cancelPreviousPerformRequestsWithTarget(self, selector: singleTapSelector, object: nil)
Run Code Online (Sandbox Code Playgroud)
nsobject.cancel不能与performSelector一起使用吗?为什么有取消功能而不是执行功能?
qwe*_*_so 16
使用
NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: "onFlip", userInfo: nil, repeats: false)
Run Code Online (Sandbox Code Playgroud)
代替.不知道为什么另一个不可用.
Val*_*gin 11
这个来自这个perfromSelector家族的方法实际上存在于Swift中,但它们在Swift 2.0之前被人为地隐藏(我认为是设计).它们可以在Swift中使用混合和一些Objective-C运行时攻击来揭开.
只需添加此扩展文件NSObject+PerformSelector.swift并使用 symbol.
In your case the code:
[self performSelector:@selector(onFlip) withObject:nil afterDelay:0.3];
Run Code Online (Sandbox Code Playgroud)
can be rewritten in Swift like this:
self.performSelector("onFlip", withObject: nil, afterDelay: 0.3)
Run Code Online (Sandbox Code Playgroud)
With using this magical category (class extension):
NSObject+PerformSelector.swift
import Foundation
private var dispatchOnceToken: dispatch_once_t = 0
private var selectors: [Selector] = [
"performSelector:",
"performSelector:withObject:",
"performSelector:withObject:withObject:",
"performSelector:withObject:afterDelay:inModes:",
"performSelector:withObject:afterDelay:",
]
private func swizzle() {
dispatch_once(&dispatchOnceToken) {
for selector: Selector in selectors {
let selector = Selector("\(selector)")
let method = class_getInstanceMethod(NSObject.self, selector)
class_replaceMethod(
NSObject.self,
selector,
method_getImplementation(method),
method_getTypeEncoding(method)
)
}
}
}
extension NSObject {
func performSelector(selector: Selector) -> AnyObject? {
swizzle()
return self.performSelector(selector)
}
func performSelector(selector: Selector, withObject object: AnyObject?) -> AnyObject? {
swizzle()
return self.performSelector(selector, withObject: object)
}
func performSelector(selector: Selector, withObject object1: AnyObject?, withObject object2: AnyObject?) -> AnyObject? {
swizzle()
return self.performSelector(selector, withObject: object1, withObject: object2)
}
func performSelector(selector: Selector, withObject object: AnyObject?, afterDelay delay: NSTimeInterval, inModes modes: [AnyObject?]?) {
swizzle()
self.performSelector(selector, withObject: object, afterDelay: delay, inModes: modes)
}
func performSelector(selector: Selector, withObject object: AnyObject?, afterDelay delay: NSTimeInterval) {
swizzle()
self.performSelector(selector, withObject: object, afterDelay: delay)
}
}
Run Code Online (Sandbox Code Playgroud)
func performFlipOnDelay() {
let delayInSeconds = 1.0
let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(delay, dispatch_get_main_queue()) {
onFlip();
}
}
Run Code Online (Sandbox Code Playgroud)
关于答案的另一轮将是上面使用GCD为要执行的动作添加延迟时间
| 归档时间: |
|
| 查看次数: |
15912 次 |
| 最近记录: |