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

Swift中如何避免重复编写序号化的按钮点击函数?

优化重复按钮点击函数的可行方案

下面提供几种彻底消除50个重复函数的方案,都是iOS开发中常用的简化手段:

方案1:利用UIButton的tag属性(最传统高效)

给每个按钮设置对应数组索引的tag,只写一个通用点击函数,通过tag直接匹配数组元素:

// 批量绑定按钮事件时循环设置tag
for index in 0..<50 {
    let button = yourButtonCollection[index] // 替换成你的按钮获取方式(数组/控件集合)
    button.tag = index
    button.addTarget(self, action: #selector(commonChooseOfferTapped(_:)), for: .touchUpInside)
}

// 通用点击处理函数
@objc private func commonChooseOfferTapped(_ sender: UIButton) {
    guard sender.tag < arrayCatched.count else { return } // 防越界
    let targetItem = arrayCatched[sender.tag]
    
    // 业务逻辑复用
    let rdvVC = ChooseRdvVC()
    rdvVC.targetData = targetItem // 替换成你的数据传递属性
    HapticsManager.shared.triggerVibration()
    navigationController?.pushViewController(rdvVC, animated: true)
}

方案2:用闭包绑定点击事件(更灵活,无tag依赖)

给UIButton扩展闭包点击能力,绑定事件时直接捕获对应索引,避免tag冲突风险:

// UIButton扩展:支持闭包形式的点击事件
extension UIButton {
    private enum AssociatedKey {
        static var tapAction: UInt8 = 0
    }
    
    private var tapAction: (() -> Void)? {
        get { objc_getAssociatedObject(self, &AssociatedKey.tapAction) as? (() -> Void) }
        set { objc_setAssociatedObject(self, &AssociatedKey.tapAction, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
    }
    
    func addTapAction(_ action: @escaping () -> Void) {
        tapAction = action
        addTarget(self, action: #selector(performTapAction), for: .touchUpInside)
    }
    
    @objc private func performTapAction() {
        tapAction?()
    }
}

// 批量绑定按钮事件
for index in 0..<50 {
    let button = yourButtonCollection[index]
    button.addTapAction { [weak self] in
        guard let self = self, index < self.arrayCatched.count else { return }
        let targetItem = self.arrayCatched[index]
        
        // 相同业务逻辑
        let rdvVC = ChooseRdvVC()
        rdvVC.targetData = targetItem
        HapticsManager.shared.triggerVibration()
        self.navigationController?.pushViewController(rdvVC, animated: true)
    }
}

方案3:使用RxSwift(如果项目已集成)

如果项目用了RxSwift,直接通过响应式绑定处理,代码更简洁:

import RxSwift
import RxCocoa

// 批量绑定
let disposeBag = DisposeBag()
for index in 0..<50 {
    let button = yourButtonCollection[index]
    button.rx.tap
        .subscribe(onNext: { [weak self] in
            guard let self = self, index < self.arrayCatched.count else { return }
            let targetItem = self.arrayCatched[index]
            
            let rdvVC = ChooseRdvVC()
            rdvVC.targetData = targetItem
            HapticsManager.shared.triggerVibration()
            self.navigationController?.pushViewController(rdvVC, animated: true)
        })
        .disposed(by: disposeBag)
}

推荐优先用方案1(无额外依赖,性能最优),如果担心tag冲突(比如按钮已有其他tag用途),则选方案2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:38:38