我像这样使用addTarget:action:forControlEvents:
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
我想把参数传递给我的选择器"switchToNewsDetails“。我成功完成的唯一一件事就是通过以下代码传递(Id)发送者:
action:@selector(switchToNewsDetails:)
但是我正在尝试传递像整数值一样的变量。这样写是行不通的:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
这样写也行不通:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
如有任何帮助,我们将不胜感激:)
发布于 2017-07-05 13:12:59
您可以使用闭包(Objective-C中的块)替换target-action,方法是添加一个辅助闭包包装器(ClosureSleeve),并将其作为关联对象添加到控件中,以便保留它。这样你就可以传递任何参数了。
Swift 3
class ClosureSleeve {
let closure: () -> ()
init(attachTo: AnyObject, closure: @escaping () -> ()) {
self.closure = closure
objc_setAssociatedObject(attachTo, "[\(arc4random())]", self, .OBJC_ASSOCIATION_RETAIN)
}
@objc func invoke() {
closure()
}
}
extension UIControl {
func addAction(for controlEvents: UIControlEvents, action: @escaping () -> ()) {
let sleeve = ClosureSleeve(attachTo: self, closure: action)
addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
}
}
用法:
button.addAction(for: .touchUpInside) {
self.switchToNewsDetails(parameter: i)
}
https://stackoverflow.com/questions/3988485
复制相似问题