首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将参数传递给addTarget:action:forControlEvents

将参数传递给addTarget:action:forControlEvents
EN

Stack Overflow用户
提问于 2010-10-21 22:23:35
回答 10查看 120.1K关注 0票数 129

我像这样使用addTarget:action:forControlEvents:

代码语言:javascript
运行
复制
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];

我想把参数传递给我的选择器"switchToNewsDetails“。我成功完成的唯一一件事就是通过以下代码传递(Id)发送者:

代码语言:javascript
运行
复制
action:@selector(switchToNewsDetails:)

但是我正在尝试传递像整数值一样的变量。这样写是行不通的:

代码语言:javascript
运行
复制
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];

这样写也行不通:

代码语言:javascript
运行
复制
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];

如有任何帮助,我们将不胜感激:)

EN

Stack Overflow用户

发布于 2017-07-05 13:12:59

您可以使用闭包(Objective-C中的块)替换target-action,方法是添加一个辅助闭包包装器(ClosureSleeve),并将其作为关联对象添加到控件中,以便保留它。这样你就可以传递任何参数了。

Swift 3

代码语言:javascript
运行
复制
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)
    }
}

用法:

代码语言:javascript
运行
复制
button.addAction(for: .touchUpInside) {
    self.switchToNewsDetails(parameter: i)
}
票数 2
EN
查看全部 10 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3988485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档