在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近在回答StackOverflow的问题时,发现performSelector方法在Swift被去掉,Apple的注释是这个方法被去掉是因为不安全: NOTE The performSelector: method and related selector-invoking methods are not imported in Swift because they are inherently unsafe. 如果在Swift调用这个方法会编译出错: 'performSelector' is unavailable: 'performSelector' methods are unavailable 反复尝试后,我发现可以使用 UIControl: func sendAction(_ action: Selector, to target: AnyObject!, forEvent event: UIEvent!) 下面是一段演示代码: import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var control:UIControl = UIControl() control.sendAction(Selector("greetings"), to: self, forEvent: nil) } func greetings() { println("greetings world") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } Log打印出: greetings world 如果是Swift调用Objective-C类的target和action,可以参考下面的例子,假设有TestClass是Objective-C类,并且有getBarButtonItem返回UIBarButtonItem: #import "TestClass.h" @implementation TestClass - (UIBarButtonItem *)getBarButtonItem { UIBarButtonItem *bar = [[UIBarButtonItem alloc] init]; bar.target = self; bar.action = @selector(help); return bar; } - (void)help { NSLog(@"Help offered"); } @end 那么在Swift里可以用下面的代码执行help方法: import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var testClass = TestClass() var button: UIButton = UIButton() var barButtonItem = testClass.getBarButtonItem() button.sendAction(barButtonItem.action, to: barButtonItem.target, forEvent: nil) } } Log打印出: 2014-07-06 23:49:49.942 TestApp [53986:2552835] Help offered 方法二:可以使用NSThread.detachNewThreadSelector,好处是可以使用延迟,并且可以附带object,下面是掩饰代码: import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let delay = 2.0 * Double(NSEC_PER_SEC) var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) dispatch_after(time, dispatch_get_main_queue(), { NSThread.detachNewThreadSelector(Selector("greetings:"), toTarget:self, withObject: "sunshine") }) } func greetings(object: AnyObject?) { println("greetings world") println("attached object: \(object)") } } 方法三:使用NSTimer: class func scheduledTimerWithTimeInterval(_ seconds: NSTimeInterval, target target: AnyObject!, selector aSelector: Selector, userInfo userInfo: AnyObject!, repeats repeats: Bool) -> NSTimer!
Xcode 6 Beta2 另外请参考一篇不错的文章:初探swift语言的学习笔记十一(performSelector)
|
请发表评论