在Swift中,如何使用在运行时确定的选择器执行Cocoa目标操作模式?
具体细节:
我的代码收到UIBarButtonItem
,它需要调用按钮代表的操作。在Objective-C中,它很简单:
UIBarButtonItem* button = ...;
[button.target performSelector: button.action withObject: self];
在Swift中,performSelector:
不会因类型/内存安全原因而暴露。因为我在编译时不知道button.action,所以我无法创建Swift闭包。还有其他任何调用动作的技术吗?
答案 0 :(得分:13)
使用
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。