You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在UIButton的addTarget方法中传递参数?

实现UIButton点击时传递id参数的几种方法

方法一:利用UIButton的tag属性

这是最直接的方式,因为你的id是整数类型,刚好可以存入UIButton自带的tag属性:

修改按钮创建代码:

func someFunc(id: Int) {
    let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
    button.tag = id // 将id赋值给tag
    button.addTarget(self, action: #selector(buttonAction(sender:)), for: .touchUpInside)
}

在点击方法中取出tag作为id传入:

@objc func buttonAction(sender: UIButton) {
    let targetId = sender.tag
    passIdHere(id: targetId)
}

方法二:使用关联对象(Associated Object)

如果你的id不是整数,或者tag已经被其他逻辑占用,可以用关联对象给按钮绑定任意类型的参数:

首先引入Runtime头文件:

import ObjectiveC

定义一个唯一的关联Key:

private var ButtonIdKey: UInt8 = 0

修改按钮创建代码,绑定id:

func someFunc(id: Int) {
    let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
    objc_setAssociatedObject(button, &ButtonIdKey, id, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    button.addTarget(self, action: #selector(buttonAction(sender:)), for: .touchUpInside)
}

在点击方法中取出关联的id:

@objc func buttonAction(sender: UIButton) {
    if let targetId = objc_getAssociatedObject(sender, &ButtonIdKey) as? Int {
        passIdHere(id: targetId)
    }
}

方法三:用闭包替代Target-Action(Swift风格)

这种方式不需要写@objc修饰的方法,直接通过闭包捕获id参数,更贴合Swift编程习惯。先给UIButton写一个扩展:

extension UIButton {
    func addTapAction(_ action: @escaping () -> Void) {
        self.addTarget(self, action: #selector(tapHandler), for: .touchUpInside)
        objc_setAssociatedObject(self, &ActionKey, action, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
    
    @objc private func tapHandler() {
        if let action = objc_getAssociatedObject(self, &ActionKey) as? () -> Void {
            action()
        }
    }
}

private var ActionKey: UInt8 = 0

创建按钮时直接用闭包传入id:

func someFunc(id: Int) {
    let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
    button.addTapAction { [weak self] in
        self?.passIdHere(id: id)
    }
}

注:[weak self]是为了避免循环引用,可根据实际场景调整。

内容的提问来源于stack exchange,提问作者developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:05:19