最近在回答StackOverflow的問題時,發現performSelector方法在Swift被去掉,Apple的註釋是這個方法被去掉是由於不安全:swift
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:ide
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打印出:spa
greetings world
若是是Swift調用Objective-C類的target和action,能夠參考下面的例子,假設有TestClass是Objective-C類,而且有getBarButtonItem返回UIBarButtonItem:.net
#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方法:code
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打印出:orm
2014-07-06 23:49:49.942 TestApp [53986:2552835] Help offered
能夠使用NSThread.detachNewThreadSelector,好處是能夠使用延遲,而且能夠附帶object,下面是掩飾代碼:blog
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:ci
class func scheduledTimerWithTimeInterval(_ seconds: NSTimeInterval, target target: AnyObject!, selector aSelector: Selector, userInfo userInfo: AnyObject!, repeats repeats: Bool) -> NSTimer!
Xcode 6 Beta2
另外請參考一篇不錯的文章:初探swift語言的學習筆記十一(performSelector)
![]() |
做者:Yang Zhou 出處:http://yangzhou1030.cnblogs.com 本文版權歸做者和博客園共有,未經做者贊成禁止轉載,做者保留追究法律責任的權利。請在文章頁面明顯位置給出原文鏈接,做者保留追究法律責任的權利。 |