3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
使用閉包
class A {
var selectorClosure: (() -> Void)?
func invoke() {
self.selectorClosure?()
}
}
var a = A()
a.selectorClosure = { println("Selector called") }
a.invoke()
請注意,這并不是什么新鮮事物,即使在Obj-C中,新的API也更喜歡使用塊performSelector(與new 相比UIAlertView,比較使用respondsToSelector:和performSelector:調(diào)用委托方法UIAlertController)。
使用performSelector:始終是不安全的,并且不能與ARC配合使用(因此有ARC警告performSelector:)。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
方法A
使用NSThread.detachNewThreadSelector,關(guān)于這種方法的好處是我們可以將對象附加到消息上。ViewController中的示例代碼:
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)")
}
控制臺日志:
問候世界
附加對象:陽光
方法B
這個(gè)替代方法是較早發(fā)現(xiàn)的,我也在設(shè)備和模擬器上進(jìn)行了測試。這個(gè)想法是使用UIControl的以下方法:
func sendAction(_ action: Selector, to target: AnyObject!, forEvent event: UIEvent!)
ViewController中的示例代碼:
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) // Use dispatch_after to invoke this line as block if delay is intended
}
func greetings() {
println("greetings world")
}
控制臺日志:
問候世界
方法C
NSTimer
class func scheduledTimerWithTimeInterval(_ seconds: NSTimeInterval,
target target: AnyObject!,
selector aSelector: Selector,
userInfo userInfo: AnyObject!,
repeats repeats: Bool) -> NSTimer!

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊
按照@JTerry的回答“在Swift中不需要選擇器”,您可以將實(shí)際方法分配給變量。我的解決方案如下(我在方法中需要一個(gè)參數(shù)):
class SettingsMenuItem: NSObject {
...
var tapFunction: ((sender: AnyObject?) -> ())?
}
然后在視圖控制器中,我以這種方式聲明,分配和運(yùn)行該函數(shù):
class SettingsViewController: UITableViewController {
func editProfile(sender: AnyObject?) {
...
}
...
menuItem.tapFunction = editProfile
...
if let tapFunction = menuItem.tapFunction {
tapFunction(sender: self)
}
}
- 3 回答
- 0 關(guān)注
- 973 瀏覽
添加回答
舉報(bào)