在Swift中调用目标操作

时间:2014-07-07 00:57:56

标签: swift

在Swift中,如何使用在运行时确定的选择器执行Cocoa目标操作模式?

具体细节: 我的代码收到UIBarButtonItem,它需要调用按钮代表的操作。在Objective-C中,它很简单:

UIBarButtonItem* button = ...;
[button.target performSelector: button.action withObject: self];

在Swift中,performSelector:不会因类型/内存安全原因而暴露。因为我在编译时不知道button.action,所以我无法创建Swift闭包。还有其他任何调用动作的技术吗?

2 个答案:

答案 0 :(得分:13)

Apple Developer Forums

回答了这个问题
  

使用UIApplication.sendAction(_:to:from:forEvent:)。从技术上讲,你   即使在Objective-C中也应该使用它,因为它理解了   动作可以采取的各种参数并传递给它们   你。

这是我最终使用的代码:

UIApplication.sharedApplication()
    .sendAction(button.action, to: button.target,
                from: self, forEvent: nil)

它与@ vladof的答案具有相同的效果,但它可以节省分配UIControl。

答案 1 :(得分:3)

假设Objective C类 TestClass 中有一个返回UIBarButtonItem的方法:

- (UIBarButtonItem *)getBarButtonItem
{
    UIBarButtonItem *bar = [[UIBarButtonItem alloc] init];
    bar.target = self;
    bar.action = @selector(help);
    return bar;
}

- (void)help
{
    NSLog(@"Help offered");
}

在斯威夫特:

var testClass = TestClass()
var barButtonItem = testClass.getBarButtonItem()
var button: UIButton = UIButton()
button.sendAction(barButtonItem.action, to: barButtonItem.target, forEvent: nil)

控制台日志:

  

2014-07-06 23:49:49.942 TestApp [53986:2552835]提供的帮助

另请注意,我们可以实例化 UIControl 而不是UIButton。