方法三:

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

最近在回答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)

作者:Yang Zhou

出处:http://yangzhou1030.cnblogs.com

本文版权归作者和博客园共有,未经作者同意禁止转载,作者保留追究法律责任的权利。请在文章页面明显位置给出原文连接,作者保留追究法律责任的权利。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航